From 10f37e0c82d75a55322247b69b4ac5fa8509abc1 Mon Sep 17 00:00:00 2001 From: Matthew Webster <mwebster@fmrib.ox.ac.uk> Date: Fri, 9 Jan 2015 16:41:17 +0000 Subject: [PATCH] Current Version Jan 15 --- fslcreatehd.cc | 151 +++++++++++++++++++------------------------------ 1 file changed, 57 insertions(+), 94 deletions(-) diff --git a/fslcreatehd.cc b/fslcreatehd.cc index 1faf1eb..947e991 100755 --- a/fslcreatehd.cc +++ b/fslcreatehd.cc @@ -23,75 +23,57 @@ void print_usage(const string& progname) int fslcreatehd_main(int argc, char *argv[]) { - FSLIO* fslio; - void *buffer=NULL; - char *hdrxml, *filename; - int fileread=1, filetype=-1, existingimage=0; - size_t bufsize=0; - short x,y,z,v, dt=-1; + NiftiIO reader; + vector <NiftiExtension> extensions; + NiftiHeader header,originalHeader; + char *buffer(NULL); + string filename; + int fileread(1); + bool existingImage(false); - if (argc==3) { - /* use the XML form of header specification */ - filename = argv[2]; - } else { - filename = argv[13]; - } + if (argc==3) /* use the XML form of header specification */ + filename = string(argv[2]); + else + filename = string(argv[13]); /* check if file already exists and if so, read the image contents */ - /* also store the size of this buffer for later in case it is wrong */ if (FslFileExists(filename)) { - /* buffer = FslReadAllVolumes(fslio,filename); */ - existingimage = 1; - fslio = FslOpen(filename,"rb"); - FslGetDim(fslio,&x,&y,&z,&v); - filetype = FslGetFileType(fslio); - bufsize = x * y * z * v * (FslGetDataType(fslio,&dt) / 8); - buffer = (void *) calloc(bufsize,1); - FslReadVolumes(fslio,buffer,v); - FslClose(fslio); + existingImage = true; + filename=return_validimagefilename(filename); + header=reader.loadImage(filename,buffer,extensions); + originalHeader=header; } - if (existingimage) { - fslio = FslXOpen(filename,"wb",filetype); - } else { - fslio = FslOpen(filename,"wb"); - filetype = FslGetFileType(fslio); - } if (argc>3) { /* set uninteresting defaults */ - if (existingimage) { - FslSetDataType(fslio,dt); - } else { - FslSetDataType(fslio,atoi(argv[12])); - } - FslSetDim(fslio,atoi(argv[1]),atoi(argv[2]),atoi(argv[3]),atoi(argv[4])); - FslSetVoxDim(fslio,atof(argv[5]),atof(argv[6]),atof(argv[7]),atof(argv[8])); - - { - short short_array[100]; - short_array[0]=atoi(argv[9]); - short_array[1]=atoi(argv[10]); - short_array[2]=atoi(argv[11]); - if ( (short_array[0]!=0) || (short_array[1]!=0) || (short_array[2]!=0) ) - { - FslSetAnalyzeSform(fslio,short_array, - atof(argv[5]),atof(argv[6]),atof(argv[7])); - } + if (!existingImage) + header.datatype=atoi(argv[12]); + header.dim[0]=4; + for (int i=1;i<=4;i++) + header.dim[i]=atoi(argv[i]); + for (int i=1;i<=4;i++) + header.pixdim[i]=atoi(argv[i+4]); + + + if ( atoi(argv[9]) != 0 || atoi(argv[10]) != 0 || atoi(argv[11]) != 0 ) { + header.sX[3]=atoi(argv[9]); + header.sY[3]=atoi(argv[10]); + header.sZ[3]=atoi(argv[11]); + header.sX[0]=atoi(argv[5]); + header.sY[1]=atoi(argv[6]); + header.sZ[2]=atoi(argv[7]); } - } else { /* read XML form */ char *newstr, *oldfname, *oldiname; ifstream inputfile; + vector<string> settings; - if (strcmp(argv[1],"-")==0) {fileread=0;} newstr = (char *)calloc(10000,1); oldfname = (char *)calloc(10000,1); oldiname = (char *)calloc(10000,1); - //hdrxml = (char *)calloc(65534,1); /* too long, to be safe */ - hdrxml = new char[65534]; if (fileread) { inputfile.open (argv[1], ifstream::in | ifstream::binary); @@ -112,60 +94,41 @@ int fslcreatehd_main(int argc, char *argv[]) { if (fgets(newstr,9999,stdin)==NULL) break; } - strcat(hdrxml,newstr); - } while (strcmp(newstr + strlen(newstr) - 2,"/>")!=0); + settings.push_back(string(newstr)); + } while (settings[settings.size()-1]!="/>"); - strcpy(oldfname,fslio->niftiptr->fname); - strcpy(oldiname,fslio->niftiptr->iname); - int bytes_read=1; //dummy for function call - fslio->niftiptr = nifti_image_from_ascii(hdrxml, &bytes_read); + header=NiftiHeader(settings); - if (fslio->niftiptr == NULL) - { - cerr << "Incomplete or incorrect text: could not form header info" << endl; - return EXIT_FAILURE; - } - - fslio->niftiptr->fname = oldfname; - fslio->niftiptr->iname = oldiname; + if (fileread) + inputfile.close(); + } - //free(hdrxml); - delete [] hdrxml; - if (fileread) inputfile.close(); + /* reset datatype in case it has been overwritten */ + if (existingImage) { + header.datatype=originalHeader.datatype; + header.bitsPerVoxel=header.bpvOfDatatype(); } - /* reset filetype and datatype in case it has been overwritten */ - - FslSetFileType(fslio,filetype); - if (existingimage) { - /* dt is only set if an image was previously read */ - FslSetDataType(fslio,dt); + /* if previously read buffer is wrong size then make a zero image here */ + if ( header.nElements() != originalHeader.nElements() ) { + if(buffer!=NULL) + delete buffer; + buffer = new char[header.nElements()*(header.bpvOfDatatype()/8)]; + fill(buffer,buffer+header.nElements(),0); } - fslio->niftiptr->byteorder = nifti_short_order(); -// if (strcmp(argv[argc-1],"-r")==0) { -// /* swap */ -// if (nifit_short_order()==MSB_FIRST) fslio->niftiptr->byteorder = LSB_FIRST; -// else fslio->niftiptr->byteorder = MSB_FIRST; -// } - - /* write header */ - - FslWriteHeader(fslio); + int filetype=FslGetEnvOutputType(); + if(!existingImage) { + filename=make_basename(filename)+outputExtension(filetype); + } - /* if previously read buffer is wrong size then make a zero image here */ - FslGetDim(fslio,&x,&y,&z,&v); - if ( bufsize != ( x * y * z * v * (FslGetDataType(fslio,&dt)/8)) ) { - if (bufsize>0) free(buffer); /* only if previously read */ - buffer = (void *) calloc(x * y * z * v,FslGetDataType(fslio,&dt)/8); - } + //header.report(); + header.bitsPerVoxel=header.bpvOfDatatype(); + header.setNiftiVersion(FslNiftiVersionFileType(filetype),FslIsSingleFileType(filetype)); + reader.saveImage(filename,buffer,extensions,header, FslIsCompressedFileType(filetype)); - /* write the data out - either from previous read or zeros */ - FslWriteVolumes(fslio,buffer,fslio->niftiptr->dim[4]); - - FslClose(fslio); return 0; -} + } int main(int argc,char *argv[]) -- GitLab