31 if(verbose>0) {printf(
"imgReadNifti(%s, ...)\n", filename); fflush(stdout);}
36 if(verbose>0) fprintf(stderr,
"Error: invalid IMG argument\n");
39 if(filename==NULL || !filename[0]) {
41 if(verbose>0) fprintf(stderr,
"Error: invalid filename\n");
54 return STATUS_NOMEMORY;
58 for(
int fi=0; fi<img->
dimt; fi++) {
86 if(verbose>0) {printf(
"imgReadNiftiFirstFrame(%s, ...)\n", filename); fflush(stdout);}
91 if(verbose>0) fprintf(stderr,
"Error: invalid IMG argument\n");
94 if(filename==NULL || !filename[0]) {
96 if(verbose>0) fprintf(stderr,
"Error: invalid filename\n");
110 return STATUS_NOMEMORY;
136 const char *filename,
142 char basefile[FILENAME_MAX], tmp[256];
143 char datfile[FILENAME_MAX], hdrfile[FILENAME_MAX], siffile[FILENAME_MAX];
149 if(verbose>0) {printf(
"imgReadNiftiHeader(%s, ...)\n", filename); fflush(stdout);}
154 if(verbose>0) fprintf(stderr,
"Error: invalid IMG argument\n");
155 return(STATUS_FAULT);
157 if(filename==NULL || !filename[0]) {
159 if(verbose>0) fprintf(stderr,
"Error: invalid filename\n");
160 return(STATUS_FAULT);
166 if(strlen(basefile)<1) {
168 if(verbose>0) fprintf(stderr,
"Error: invalid filename\n");
169 return(STATUS_FAULT);
173 ret=
niftiExists(basefile, hdrfile, datfile, siffile, &dsr, verbose-2, tmp);
176 if(verbose>0) fprintf(stderr,
"Error: %s\n", tmp);
177 return(STATUS_NOFILE);
179 if(ret==1 && verbose>1) printf(
"no SIF found for %s\n", basefile);
195 if(verbose>1) {printf(
"reading SIF %s\n", siffile); fflush(stdout);}
197 if(
sifRead(siffile, &sif)!=0)
return STATUS_OK;
226 if(verbose>0) {printf(
"imgGetNiftiHeader()\n"); fflush(stdout);}
229 if(img==NULL)
return STATUS_FAULT;
233 if(dsr==NULL)
return STATUS_FAULT;
238 int dimNr=dsr->
h.
dim[0];
239 if(dimNr<2 || dimNr>4) {
241 fprintf(stderr,
"Error: Nifti image dimension %d is not supported\n", dimNr);
242 return STATUS_UNSUPPORTED;
244 int dimx, dimy, dimz=1, dimt=1;
245 dimx=dsr->
h.
dim[1]; dimy=dsr->
h.
dim[2];
246 if(dimNr>2) {dimz=dsr->
h.
dim[3];
if(dimNr>3) dimt=dsr->
h.
dim[4];}
247 long long pxlNr=dimx*dimy*dimz;
249 if(verbose>0) fprintf(stderr,
"Error: invalid Nifti image dimensions.\n");
250 return STATUS_INVALIDHEADER;
262 if(verbose>0) fprintf(stderr,
"Error: invalid Nifti magic number.\n");
263 return STATUS_INVALIDHEADER;
272 if(verbose>2) printf(
"pixel size conversion factor := %g\n", f);
273 for(
int i=1; i<=3; i++) {
318 const char *filename,
328 char basefile[FILENAME_MAX], tmp[256];
329 char datfile[FILENAME_MAX], hdrfile[FILENAME_MAX], siffile[FILENAME_MAX];
334 float *fdata=NULL, *fptr;
338 printf(
"\nimgReadNiftiFrame(%s, %d, *img, %d, %d)\n",
339 filename, frame_to_read, frame_index, verbose);
346 if(verbose>0) fprintf(stderr,
"Error: invalid IMG argument\n");
347 return(STATUS_FAULT);
349 if(filename==NULL || !filename[0]) {
351 if(verbose>0) fprintf(stderr,
"Error: invalid filename\n");
352 return(STATUS_FAULT);
354 if(frame_index<0 || frame_index>img->
dimt-1 || frame_to_read<1) {
356 if(verbose>0) fprintf(stderr,
"Error: invalid frame settings\n");
362 if(strlen(basefile)<1) {
364 if(verbose>0) fprintf(stderr,
"Error: invalid filename\n");
365 return(STATUS_FAULT);
369 ret=
niftiExists(basefile, hdrfile, datfile, siffile, &dsr, verbose-2, tmp);
372 if(verbose>0) fprintf(stderr,
"Error: %s\n", tmp);
373 return(STATUS_NOFILE);
375 if(ret==1 && verbose>1) {
376 printf(
"no SIF found for %s\n", basefile); fflush(stdout);}
379 if(verbose>2) {fprintf(stdout,
"reading image data %s\n", datfile); fflush(stdout);}
380 if((fp=fopen(datfile,
"rb")) == NULL) {
382 return STATUS_NOIMGDATAFILE;
387 fdata=calloc((
size_t)img->
dimx*img->
dimy*img->
dimz,
sizeof(
float));
388 if(fdata==NULL) {fclose(fp);
return STATUS_NOMEMORY;}
393 if(verbose>1) printf(
"niftiReadImagedata() -> %s\n", tmp);
397 return STATUS_NOMATRIX;
401 return STATUS_UNSUPPORTED;
408 long long int goodNr=0;
410 for(
int zi=0; zi<img->
dimz; zi++)
411 for(
int yi=0; yi<img->
dimy; yi++)
412 for(
int xi=0; xi<img->
dimx; xi++) {
413 if(isfinite(*fptr)) goodNr++;
else *fptr=0.0;
419 return STATUS_NOIMGDATA;
425 for(
int zi=0; zi<img->
dimz; zi++)
426 for(
int yi=0; yi<img->
dimy; yi++)
427 for(
int xi=0; xi<img->
dimx; xi++)
428 img->
m[zi][yi][xi][frame_index]=*fptr++;
442 if(
sifRead(siffile, &sif)!=0) {
443 if(verbose>1) {fprintf(stdout,
" cannot read SIF (%s)\n", siffile); fflush(stdout);}
447 if(verbose>3) {fprintf(stdout,
" setting frame times\n"); fflush(stdout);}
448 if(sif.
frameNr>=frame_to_read) {
449 img->
start[frame_index]=sif.
x1[frame_to_read-1];
450 img->
end[frame_index]=sif.
x2[frame_to_read-1];
451 img->
mid[frame_index]=0.5*(img->
start[frame_index]+img->
end[frame_index]);
486 printf(
"\nimgSetNiftiHeader(*img, %s, *dsr, %g, %g, ...)\n", dbname, fmin, fmax);
490 if(dbname==NULL || !dbname[0]) {
491 if(verbose>0) fprintf(stderr,
"Error: invalid filename\n");
492 return(STATUS_FAULT);
495 if(verbose>0) fprintf(stderr,
"Error: invalid IMG argument\n");
496 return(STATUS_FAULT);
499 if(verbose>0) fprintf(stderr,
"Error: invalid header struct\n");
513 char *cptr=strrchr(dbname,
'/');
if(cptr==NULL) cptr=strrchr(dbname,
'\\');
514 if(cptr!=NULL) cptr++;
515 if(cptr==NULL) cptr=(
char*)dbname;
522 for(
int i=0; i<8; i++) dsr->
h.
dim[i]=1;
535 for(
int i=0; i<8; i++) dsr->
h.
pixdim[i]=0.0;
574 else strcpy(dsr->
h.
magic,
"n+1");
621 char imgfile[FILENAME_MAX], hdrfile[FILENAME_MAX], siffile[FILENAME_MAX];
624 float *fdata=NULL, *fptr;
628 printf(
"\nimgWriteNiftiFrame(%s, %d, *img, %d, %g, %g, ...)\n",
629 dbname, frame_to_write, frame_index, fmin, fmax);
635 if(dbname==NULL || !dbname[0]) {
637 if(verbose>0) fprintf(stderr,
"Error: invalid filename\n");
638 return(STATUS_FAULT);
642 if(verbose>0) fprintf(stderr,
"Error: invalid IMG argument\n");
643 return(STATUS_FAULT);
645 if(frame_index<0 || frame_index>img->
dimt-1 || frame_to_write<0) {
647 if(verbose>0) fprintf(stderr,
"Error: invalid frame settings\n");
652 if(verbose>0) fprintf(stderr,
"Error: invalid file format setting\n");
663 fileis=
niftiExists(dbname, hdrfile, imgfile, siffile, &dsr, verbose-2, NULL);
666 printf(
" writing 1st frame to a new file\n"); fflush(stdout);}
674 if(verbose>0) fprintf(stderr,
"Error: cannot read NIfTI header\n");
675 return STATUS_INVALIDHEADER;
677 if(frame_to_write==0) frame_to_write=1;
683 if(verbose>0) fprintf(stderr,
"Error in niftiWriteHeader(): %s\n", tmp);
684 return STATUS_CANTWRITEHEADERFILE;
689 if(access(imgfile, 0) != -1) {
690 if(verbose>0) printf(
" removing %s\n", imgfile);
695 if(verbose>1) printf(
" adding frame to an existing file\n");
700 if(verbose>0) fprintf(stderr,
"Error: cannot read NIfTI header\n");
706 fprintf(stderr,
"Error: different file format\n");
707 printf(
" new._fileFormat:=%d\n", img->
_fileFormat);
708 printf(
" prev._fileFormat:=%d\n", test_img.
_fileFormat);
710 imgEmpty(&test_img);
return STATUS_WRONGFILETYPE;
717 fprintf(stderr,
"Error: different datatype\n");
718 printf(
" new._dataType:=%d\n", img->
_dataType);
719 printf(
" prev._dataType:=%d\n", test_img.
_dataType);
721 imgEmpty(&test_img);
return STATUS_WRONGFILETYPE;
726 if(verbose>0) fprintf(stderr,
"Error: different matrix size\n");
727 imgEmpty(&test_img);
return STATUS_VARMATSIZE;}
731 if(frame_to_write==0) frame_to_write=dsr.
h.
dim[4]+1;
732 if(dsr.
h.
dim[4]<frame_to_write) {
733 if(dsr.
h.
dim[4]+1<frame_to_write) {
734 if(verbose>0) fprintf(stderr,
"Error: missing matrix\n");
735 return STATUS_MISSINGMATRIX;
737 dsr.
h.
dim[4]=frame_to_write;
741 if(verbose>0) fprintf(stderr,
"Error: %s.\n", tmp);
742 return STATUS_NOWRITEPERM;
746 printf(
"frame_to_write := %d\n", frame_to_write);
747 printf(
"vox_offset := %d\n", (
int)dsr.
h.
vox_offset);
748 printf(
"hdrfile := %s\n", hdrfile);
749 printf(
"imgfile := %s\n", imgfile);
750 printf(
"siffile := %s\n", siffile);
751 printf(
"magic := %s\n", dsr.
h.
magic);
756 fp=fopen(imgfile,
"wb");
758 fp=fopen(imgfile,
"r+b");
760 if(verbose>0) fprintf(stderr,
"Error: cannot open %s for write.\n",imgfile);
761 return STATUS_CANTWRITEIMGFILE;
766 if(fseeko(fp, (
int)dsr.
h.
vox_offset+(frame_to_write-1)*voxNr*
sizeof(
float),
769 if(verbose>0) fprintf(stderr,
"Error: invalid file write position.\n");
770 fclose(fp);
return STATUS_MISSINGMATRIX;
774 fdata=(
float*)calloc(voxNr,
sizeof(
float));
776 if(verbose>0) fprintf(stderr,
"Error: out of memory.\n");
777 fclose(fp);
return STATUS_NOMEMORY;
782 for(
int zi=0; zi<img->
dimz; zi++)
783 for(
int yi=0; yi<img->
dimy; yi++)
784 for(
int xi=0; xi<img->
dimx; xi++, fptr++)
785 *fptr=img->
m[zi][yi][xi][frame_index];
787 if(fwrite(fptr,
sizeof(
float), voxNr, fp) != (
unsigned int)voxNr) {
788 if(verbose>0) fprintf(stderr,
"Error: disk full or no write permission.\n");
789 free(fdata); fclose(fp);
return STATUS_CANTWRITEIMGFILE;
822 char imgfile[FILENAME_MAX], hdrfile[FILENAME_MAX], siffile[FILENAME_MAX];
827 printf(
"imgWriteNifti(%s, *img, %d, ...)\n", dbname, save_sif);
834 if(dbname==NULL || !dbname[0]) {
836 if(verbose>0) fprintf(stderr,
"Error: invalid filename\n");
837 return(STATUS_FAULT);
841 if(verbose>0) fprintf(stderr,
"Error: invalid IMG argument\n");
842 return(STATUS_FAULT);
846 if(verbose>0) fprintf(stderr,
"Error: invalid file format setting\n");
853 if(verbose>0) fprintf(stderr,
" Error: invalid NIfTI name %s\n", dbname);
860 if(verbose>0) fprintf(stderr,
" Error: cannot delete previous NIfTI.\n");
862 return STATUS_CANNOTERASE;
870 if(verbose>1) {fprintf(stdout,
" searching min and max\n"); fflush(stdout);}
873 if(verbose>0) fprintf(stderr,
" Error: %s\n",
imgStatus(ret));
875 return STATUS_NOIMGDATA;
878 printf(
" global_min := %g\n global_max := %g\n", fmin, fmax);
884 for(
int fi=0, ret=0; fi<img->
dimt; fi++) {
886 if(ret!=STATUS_OK)
break;
887 if(verbose>4) {printf(
" frame written.\n"); fflush(stdout);}
892 if(verbose>0) fprintf(stderr,
"Error: %s.\n",
imgStatus(ret));
910 ret=
img2sif(img, &sif, 1, 1, 0, verbose-3);
913 ret=
img2sif(img, &sif, 1, 1, 2, verbose-3);
917 ret=
img2sif(img, &sif, 1, 1, 2, verbose-3);
920 if(verbose>0) fprintf(stderr,
" Error: cannot create SIF contents.\n");
923 return STATUS_CANNOTWRITE;
928 if(verbose>0) fprintf(stderr,
" Error: cannot write %s\n", siffile);
931 return STATUS_CANNOTWRITE;
double hlFromIsotope(char *isocode)
char * imgStatus(int status_index)
int imgAllocate(IMG *image, int planes, int rows, int columns, int frames)
void imgSetStatus(IMG *img, int status_index)
void imgEmpty(IMG *image)
int imgSetNiftiHeader(IMG *img, const char *dbname, NIFTI_DSR *dsr, float fmin, float fmax, int verbose)
int imgReadNiftiFirstFrame(const char *filename, IMG *img, int verbose)
int imgReadNiftiHeader(const char *filename, IMG *img, int verbose)
int imgReadNifti(const char *filename, IMG *img, int verbose)
int imgReadNiftiFrame(const char *filename, int frame_to_read, IMG *img, int frame_index, int verbose)
int imgWriteNiftiFrame(const char *dbname, int frame_to_write, IMG *img, int frame_index, float fmin, float fmax, int verbose)
int imgWriteNifti(const char *dbname, IMG *img, int save_sif, int verbose)
int imgGetNiftiHeader(IMG *img, NIFTI_DSR *dsr, int verbose)
int img2sif(IMG *img, SIF *sif, int copy_header, int copy_frames, int copy_counts, int verbose)
int imgMinMax(IMG *img, float *minvalue, float *maxvalue)
Header file for libtpcimgio.
int sifWrite(SIF *data, char *filename)
#define IMG_STATUS_OCCUPIED
int niftiWriteHeader(char *filename, NIFTI_DSR *dsr, int verbose, char *status)
int niftiCreateFNames(const char *filename, char *hdrfile, char *imgfile, char *siffile, int fileformat)
#define NIFTI_UNITS_METER
void niftiRemoveFNameExtension(char *fname)
int niftiReadImagedata(FILE *fp, NIFTI_DSR *h, int frame, float *data, int verbose, char *status)
#define IMG_STATUS_INITIALIZED
int niftiExists(const char *dbname, char *hdrfile, char *imgile, char *siffile, NIFTI_DSR *header, int verbose, char *status)
#define NIFTI_UNITS_MICRON
#define NIFTI_HEADER_SIZE
#define NIFTI_INTENT_NONE
int niftiRemove(const char *dbname, int fileformat, int verbose)
int sifRead(char *filename, SIF *data)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
char studyNr[MAX_STUDYNR_LEN+1]
char studynr[MAX_STUDYNR_LEN+1]