Skip to content
Snippets Groups Projects
Commit 10f37e0c authored by Matthew Webster's avatar Matthew Webster
Browse files

Current Version Jan 15

parent 9b3a18b5
No related branches found
No related tags found
No related merge requests found
......@@ -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[])
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment