1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "libics.h"
int main(int argc, const char* argv[]) {
ICS* ip;
Ics_DataType dt;
int ndims;
size_t dims[ICS_MAXDIM];
size_t bufsize;
void* buf1;
void* buf2;
Ics_Error retval;
double origin;
double scale;
const char* units;
char key[ICS_STRLEN_TOKEN];
char value[ICS_LINE_LENGTH];
if (argc != 2) {
fprintf(stderr, "One file name required\n");
exit(-1);
}
/* Open image for update */
retval = IcsOpen(&ip, argv[1], "rw");
if (retval != IcsErr_Ok) {
fprintf(stderr, "Could not open input file: %s\n",
IcsGetErrorText(retval));
exit(-1);
}
IcsGetLayout(ip, &dt, &ndims, dims);
bufsize = IcsGetDataSize(ip);
buf1 = malloc(bufsize);
if (buf1 == NULL) {
fprintf(stderr, "Could not allocate memory.\n");
exit(-1);
}
retval = IcsGetData(ip, buf1, bufsize);
if (retval != IcsErr_Ok) {
fprintf(stderr, "Could not read input image data: %s\n",
IcsGetErrorText(retval));
exit(-1);
}
/* Add and change metadata */
retval = IcsSetPosition(ip, 0, 1834, 0.02, "millimeter");
if (retval == IcsErr_Ok)
retval = IcsSetPosition(ip, 1, -653, 0.014, "mm");
if (retval != IcsErr_Ok) {
fprintf(stderr, "Could not set pixel position: %s\n",
IcsGetErrorText(retval));
exit(-1);
}
retval = IcsAddHistory(ip, "test", "Adding history line.");
if (retval != IcsErr_Ok) {
fprintf(stderr, "Could not add history line: %s\n",
IcsGetErrorText(retval));
exit(-1);
}
/* Commit changes */
retval = IcsClose(ip);
if (retval != IcsErr_Ok) {
fprintf(stderr, "Could not close input file: %s\n",
IcsGetErrorText(retval));
exit(-1);
}
/* Read image */
retval = IcsOpen(&ip, argv[1], "r");
if (retval != IcsErr_Ok) {
fprintf(stderr, "Could not open output file for reading: %s\n",
IcsGetErrorText(retval));
exit(-1);
}
/* Check metadata */
retval = IcsGetPositionF(ip, 0, &origin, &scale, &units);
if (retval == IcsErr_Ok) {
if (origin != 1834 || scale != 0.02 || strcmp(units, "millimeter") != 0 ) {
fprintf(stderr, "Different position metadata read back\n");
exit(-1);
}
retval = IcsGetPositionF(ip, 1, &origin, &scale, &units);
if (retval == IcsErr_Ok) {
if (origin != -653 || scale != 0.014 || strcmp(units, "mm") != 0) {
fprintf(stderr, "Different position metadata read back\n");
exit(-1);
}
}
}
if (retval != IcsErr_Ok) {
fprintf(stderr, "Could not get pixel position: %s\n",
IcsGetErrorText(retval));
exit(-1);
}
retval = IcsGetHistoryKeyValue(ip, key, value, IcsWhich_First);
if (retval != IcsErr_Ok) {
fprintf(stderr, "Could not get history key/value pair: %s\n",
IcsGetErrorText(retval));
exit(-1);
}
if (strcmp(key, "test") != 0 || strcmp(value, "Adding history line.") != 0) {
fprintf(stderr, "Different history key/value pair read back\n");
exit(-1);
}
/* Check pixel data */
if (bufsize != IcsGetDataSize(ip)) {
fprintf(stderr, "Data in output file not same size as input.\n");
exit(-1);
}
buf2 = malloc(bufsize);
if (buf2 == NULL) {
fprintf(stderr, "Could not allocate memory.\n");
exit(-1);
}
retval = IcsGetData(ip, buf2, bufsize);
if (retval != IcsErr_Ok) {
fprintf(stderr, "Could not read output image data: %s\n",
IcsGetErrorText(retval));
exit(-1);
}
retval = IcsClose(ip);
if (retval != IcsErr_Ok) {
fprintf(stderr, "Could not close output file: %s\n",
IcsGetErrorText(retval));
exit(-1);
}
if (memcmp(buf1, buf2, bufsize) != 0) {
fprintf(stderr, "Data in output file does not match data in input.\n");
exit(-1);
}
free(buf1);
free(buf2);
exit(0);
}
|