79 {
80 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
81 if(verbose>0) {printf("%s(..., %s, ...)\n", __func__, fname); fflush(stdout);}
82
83 if(img==NULL ||
strnlen(fname, 2)<1) {
86 }
87
89
90
91 if(verbose>1) printf("checking that %s exists and is NIfTI\n", fname);
92 char hdrfile[FILENAME_MAX], imgfile[FILENAME_MAX], siffile[FILENAME_MAX];
94 if(!
niftiExists(fname, hdrfile, imgfile, siffile, &dsr, status)) {
95 if(status!=NULL)
return(status->
error);
97 }
98 if(verbose>1) printf("NIfTI header read from %s\n", hdrfile);
99
100
101 if(verbose>2) printf(" verifying datatype\n");
102 int datatype=0;
104 switch(datatype) {
115 break;
125 default:
126 if(verbose>0) printf("Error: currently unsupported NIfTI datatype %d\n", datatype);
129 }
130 int bitpix=0;
132 if(verbose>2) printf(" bits per pixel := %d\n", bitpix);
133 if(bitpix==0) {
135 }
136 if(bitpix<8 || (bitpix%8)!=0) {
139 }
140 if(bitpix>64) {
143 }
144 int bytepix=bitpix/8; if(verbose>2) printf(" bytes per pixel := %d\n", bytepix);
145
146
147
148 {
151 statusSet(status, __func__, __FILE__, __LINE__, ret);
152 return(ret);
153 }
154 if(verbose>1) printf("allocating memory for 4D image\n");
156 if(ret) return(ret);
157 }
158
159
160 {
163 statusSet(status, __func__, __FILE__, __LINE__, ret);
164 return(ret);
165 }
167 }
168
169
170 if(verbose>1) printf("reading pixel data in %s\n", imgfile);
171 FILE *fp=fopen(imgfile, "rb");
172 if(fp==NULL) {
176 }
177
178
179
180
181 long long start_pos=0;
182 {
183 long long int s=0;
185 if(s<0) start_pos=-s; else start_pos=s;
186
189 start_pos=s;
190 }
191 if(verbose>2) printf(" image_start_pos := %llu\n", start_pos);
192
193 if(start_pos>0) {
194 fseeko(fp, start_pos, SEEK_SET);
195 if(ftello(fp)!=start_pos) {
199 }
200 }
201
202
204 if(verbose>2) printf(" pixels/frame := %llu\n", pxlNr);
205 long long rawSize=pxlNr*(bitpix/8);
206 if(verbose>1) printf(" raw bytes per frame := %lld\n", rawSize);
207 if(verbose>1) printf(" allocating memory for raw binary data\n");
208 unsigned char *buf=(unsigned char*)malloc(rawSize);
209 if(buf==NULL) {
213 }
214
215
216 if(verbose>1) printf(" reading binary data\n");
218 int byteconv=0;
220 byteconv=1;
221 if(verbose>1) printf(" byte conversion needed\n");
222 }
223
224 float scl_slope, scl_inter;
227 if(scl_slope==0.0) scl_slope=1.0;
228
229 for(
int ti=0; ti<img->
dimt; ti++) {
230 if(verbose>3) printf(" frame %d\n", 1+ti);
231 if(fread(buf, rawSize, 1, fp) < 1) {
232 fclose(fp);
imgFree(img); free(buf);
235 }
236
237 if(byteconv) switch(bitpix) {
238 case 8: break;
239 case 16:
swap16ip(buf, pxlNr);
break;
240 case 32:
swap32ip(buf, pxlNr);
break;
241 case 64:
swap64ip(buf, pxlNr);
break;
242 default: break;
243 }
244
245 int ret=0;
246 unsigned char *bptr=buf;
247 switch(datatype) {
250 if(bitpix!=8) {ret=1; break;}
251 for(
int zi=0; zi<img->
dimz; zi++)
252 for(
int yi=0; yi<img->
dimy; yi++)
253 for(
int xi=0; xi<img->
dimx; xi++) {
254 img->
m[zi][yi][xi][ti]=scl_inter+scl_slope*(float)(*bptr);
255 bptr++;
256 }
257 break;
259 if(bitpix!=16) {ret=1; break;}
260 for(
int zi=0; zi<img->
dimz; zi++)
261 for(
int yi=0; yi<img->
dimy; yi++)
262 for(
int xi=0; xi<img->
dimx; xi++) {
263 uint16_t a;
264 memcpy(&a, bptr, 2);
265 img->
m[zi][yi][xi][ti]=scl_inter+scl_slope*(float)a;
266 bptr+=bytepix;
267 }
268 break;
270 if(bitpix!=16) {ret=1; break;}
271 for(
int zi=0; zi<img->
dimz; zi++)
272 for(
int yi=0; yi<img->
dimy; yi++)
273 for(
int xi=0; xi<img->
dimx; xi++) {
274 int16_t a;
275 memcpy(&a, bptr, 2);
276 img->
m[zi][yi][xi][ti]=scl_inter+scl_slope*(float)a;
277 bptr+=bytepix;
278 }
279 break;
281 if(bitpix!=32) {ret=1; break;}
282 for(
int zi=0; zi<img->
dimz; zi++)
283 for(
int yi=0; yi<img->
dimy; yi++)
284 for(
int xi=0; xi<img->
dimx; xi++) {
285 int32_t a;
286 memcpy(&a, bptr, 4);
287 img->
m[zi][yi][xi][ti]=scl_inter+scl_slope*(float)a;
288 bptr+=bytepix;
289 }
290 break;
292 if(bitpix!=32) {ret=1; break;}
293 for(
int zi=0; zi<img->
dimz; zi++)
294 for(
int yi=0; yi<img->
dimy; yi++)
295 for(
int xi=0; xi<img->
dimx; xi++) {
296 uint32_t a;
297 memcpy(&a, bptr, 4);
298 img->
m[zi][yi][xi][ti]=scl_inter+scl_slope*(float)a;
299 bptr+=bytepix;
300 }
301 break;
303 if(bitpix!=64) {ret=1; break;}
304 for(
int zi=0; zi<img->
dimz; zi++)
305 for(
int yi=0; yi<img->
dimy; yi++)
306 for(
int xi=0; xi<img->
dimx; xi++) {
307 int64_t a;
308 memcpy(&a, bptr, 8);
309 img->
m[zi][yi][xi][ti]=scl_inter+scl_slope*(float)a;
310 bptr+=bytepix;
311 }
312 break;
314 if(bitpix!=64) {ret=1; break;}
315 for(
int zi=0; zi<img->
dimz; zi++)
316 for(
int yi=0; yi<img->
dimy; yi++)
317 for(
int xi=0; xi<img->
dimx; xi++) {
318 uint64_t a;
319 memcpy(&a, bptr, 8);
320 img->
m[zi][yi][xi][ti]=scl_inter+scl_slope*(float)a;
321 bptr+=bytepix;
322 }
323 break;
325 if(bitpix!=32) {ret=1; break;}
326 for(
int zi=0; zi<img->
dimz; zi++)
327 for(
int yi=0; yi<img->
dimy; yi++)
328 for(
int xi=0; xi<img->
dimx; xi++) {
329 float a;
330 memcpy(&a, bptr, 4);
331 img->
m[zi][yi][xi][ti]=scl_inter+scl_slope*a;
332 bptr+=bytepix;
333 }
334 break;
336 if(bitpix!=64) {ret=1; break;}
337 for(
int zi=0; zi<img->
dimz; zi++)
338 for(
int yi=0; yi<img->
dimy; yi++)
339 for(
int xi=0; xi<img->
dimx; xi++) {
340 double a;
341 memcpy(&a, bptr, 8);
342 img->
m[zi][yi][xi][ti]=scl_inter+scl_slope*(float)a;
343 bptr+=bytepix;
344 }
345 break;
346 default:
347 ret=2;
348 }
349 if(ret) {
350 fclose(fp);
imgFree(img); free(buf);
353 }
354 }
355 fclose(fp); free(buf);
356
357
358
359 if(siffile[0]) {
360 if(verbose>0) {printf("reading SIF %s\n", siffile); fflush(stdout);}
362 int ret=
tacRead(&sif, siffile, status);
364 ret=
imgFromSIF(img, &sif, 1, 1, 0, verbose-1);
368 statusSet(status, __func__, __FILE__, __LINE__, ret);
369 return(ret);
370 }
371 }
372
375}
void swap32ip(void *buf, unsigned long long size)
void swap64ip(void *buf, unsigned long long size)
void swap16ip(void *buf, unsigned long long size)
int imgAllocate(IMG *img, const unsigned int dimz, const unsigned int dimy, const unsigned int dimx, const unsigned int dimt, TPCSTATUS *status)
char * imgFormatDescr(imgformat c)
int imgGetNiftiHeader(IMG *img, NIFTI_DSR *dsr, int verbose)
int imgFromSIF(IMG *img, TAC *sif, int copy_header, int copy_frames, int copy_counts, int verbose)
int niftiExists(const char *filename, char *hdrfile, char *imgfile, char *siffile, NIFTI_DSR *header, TPCSTATUS *status)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
size_t strnlen(const char *s, size_t n)
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
int tacRead(TAC *d, const char *fname, TPCSTATUS *status)
@ TPCERROR_CANNOT_OPEN
Cannot open file.
@ TPCERROR_OUT_OF_MEMORY
Cannot allocate memory.
@ TPCERROR_CANNOT_READ
Cannot read file.
#define NIFTI_DT_LONG_DOUBLE
#define NIFTI_DT_UNSIGNED_SHORT
#define NIFTI_DT_SIGNED_SHORT
#define NIFTI_DT_UNSIGNED_INT
#define NIFTI_DT_UNSIGNED_LONG_LONG
#define NIFTI_DT_SIGNED_INT
#define NIFTI_DT_UNSIGNED_CHAR
#define NIFTI1_HEADER_SIZE
#define NIFTI2_HEADER_SIZE
#define NIFTI_DT_DOUBLE_PAIR
#define NIFTI_DT_SIGNED_CHAR
#define NIFTI_DT_LONG_LONG
#define NIFTI_DT_LONG_DOUBLE_PAIR