-
Matthew Webster authoredMatthew Webster authored
fslcorrecthd.cc 2.51 KiB
// fslcorrecthd.cc - check and correct a nifti file for bad vox-offset
// Matthew Webster, FMRIB Image Analysis Group
// Copyright (C) 2007 University of Oxford
// CCOPYRIGHT
#include "newimage/newimageall.h"
#include "fslio/fslio.h"
#include <iostream>
using namespace NEWIMAGE;
void print_usage(const string& progname)
{
cout << endl;
cout << "Usage: fslcorrecthd <input> <output>" << endl;
cout << " Note that fslcorrecthd only operates on uncompressed NIFTI or ANALYZE files" << endl;
}
int main(int argc,char *argv[])
{
if (argc < 3)
{
print_usage(string(argv[0]));
return 1;
}
FSLIO* fslio=NULL;
fslio = FslOpen(FslMakeBaseName(argv[1]),"rb");
FslClose(fslio);
struct dsr *hdr;
hdr = (struct dsr *)calloc(1,sizeof(struct dsr));
FslReadRawHeader(hdr,fslio->niftiptr->fname);
if (fslio->niftiptr->byteorder != nifti_short_order())
{
cout << "Byte swapping" << endl;
AvwSwapHeader(hdr);
}
//check nifti-libs output versus raw header info
int offset =(int) ( fslio->niftiptr->iname_offset - hdr->dime.vox_offset );
int minft=(int)MIN(fslio->niftiptr->iname_offset,hdr->dime.vox_offset);
cout << "number of bytes wrong: " << offset << endl << "start at byte location: " << minft << endl;
if (offset==0) {
cout << "No byte correction needed, exiting." << endl;
return 0;
}
if (FslIsCompressedFileType(FslGetFileType(fslio))) {
cerr << "Error: fslcorrecthd requires uncompressed input" << endl;
return 1;
}
ifstream input_file;
ofstream output_file;
char *temp,*outputName,*inputName;
FslGetHdrImgNames(argv[2],fslio,&temp,&outputName);
FslGetHdrImgNames(argv[1],fslio,&temp,&inputName);
char byte[1];
input_file.open(inputName,ios::in | ios :: binary);
output_file.open(outputName,ofstream::out | ofstream::binary);
for(int i=1;i<=minft;i++) //Write Header
{
input_file.read(byte,1);
if (input_file.eof()) break;
output_file.write(byte,1);
}
for(int i=1;i<=abs(offset) && offset>0;i++) //Pad if we have missing 4 bytes
{
byte[0]=0;
output_file.write(byte,1);
}
for(int i=1;i<=abs(offset) && offset<0;i++) //Read past bad extensions/junk
{
input_file.read(byte,1);
}
while(true) //Copy the data
{
input_file.read(byte,1);
if (input_file.eof()) break;
output_file.write(byte,1);
}
output_file.close();
input_file.close();
system(("FSLOUTPUTTYPE=NIFTI; ${FSLDIR}/bin/fslmaths " + string(outputName)).c_str()); //To clean up header
free(temp);
free(outputName);
free(hdr);
return 0;
}