fslio.c
来自「DTMK软件开发包,此为开源软件,是一款很好的医学图像开发资源.」· C语言 代码 · 共 1,842 行 · 第 1/5 页
C
1,842 行
FSLIO *FslInit(void)
{
FSLIO *fslio;
fslio = (FSLIO *) calloc(1,sizeof(FSLIO));
FslSetInit(fslio);
return fslio;
}
void FslSetInit(FSLIO* fslio)
{
/* set some sensible defaults */
fslio->niftiptr = NULL;
fslio->mincptr = NULL;
FslSetFileType(fslio,FslGetEnvOutputType());
FslSetWriteMode(fslio,0);
fslio->written_hdr = 0;
}
void FslInit4Write(FSLIO* fslio, const char* filename, int ft)
{
/* ft determines filetype if ft>=0*/
int imgtype;
FslSetWriteMode(fslio,1);
/* Determine file type from image name (first priority) or environment (default) */
imgtype = FslFileType(filename);
if (imgtype<0) imgtype = FslGetEnvOutputType();
if (ft >= 0) imgtype = ft;
if (!FslIsValidFileType(imgtype)) {
fprintf(stderr,"Error: Failed to determine file type for writing in FslOpen()\n");
exit(EXIT_FAILURE);
}
if ( (FslBaseFileType(imgtype)!=FSL_TYPE_MINC) ) {
FslInitHeader(fslio, NIFTI_TYPE_FLOAT32,
1, 1, 1, 3, 0.0, 0.0, 0.0, 0.0, 4, "mm");
FslSetFileType(fslio,imgtype); /* this is after InitHeader as niftiptr set there */
/* determine the header and image filename */
FslGetHdrImgNames(filename,fslio,&(fslio->niftiptr->fname),&(fslio->niftiptr->iname));
if ( (fslio->niftiptr->fname == NULL) || (fslio->niftiptr->iname == NULL) ) {
fprintf(stderr,"Error: cannot find filenames for %s\n",filename);
}
} else if (FslBaseFileType(imgtype)==FSL_TYPE_MINC) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
return;
} else {
fprintf(stderr,"Error:: unrecognised image type requested\n");
return;
}
return;
}
void FslInitHeader(FSLIO *fslio, short t,
size_t x, size_t y, size_t z, size_t v,
float vx, float vy, float vz, float tr,
size_t dim,
const char* units)
{
/* NB: This function does not set the file type or write mode*/
if (fslio==NULL) FSLIOERR("FslInitHeader: Null pointer passed for FSLIO");
fslio->niftiptr = nifti_simple_init_nim();
/* make nifti type consistent with fslio */
fslio->niftiptr->nifti_type = FslBaseFileType(fslio->file_mode);
fslio->mincptr = NULL;
FslSetDataType(fslio,t);
FslSetDim(fslio,x,y,z,v);
FslSetVoxDim(fslio,vx,vy,vz,tr);
FslSetTimeUnits(fslio,"s");
FslSetDimensionality(fslio,dim);
}
void FslCloneHeader(FSLIO *dest, const FSLIO *src)
{
/* only clone the information that is stored in the disk version of the header */
/* - therefore _not_ the filenames, output type, write mode, etc */
char *fname=NULL, *iname=NULL;
void *data=NULL;
int filetype, writemode;
int preserve_nifti_values = 0;
if (dest==NULL) FSLIOERR("FslCloneHeader: Null pointer passed for FSLIO");
if (src==NULL) FSLIOERR("FslCloneHeader: Null pointer passed for FSLIO");
if (src->niftiptr!=NULL) {
/* preserve the filenames, output type and write mode */
if (dest->niftiptr != NULL) {
fname = dest->niftiptr->fname;
iname = dest->niftiptr->iname;
data = dest->niftiptr->data;
preserve_nifti_values = 1;
}
filetype = FslGetFileType2(dest,1);
writemode = FslGetWriteMode(dest);
/* copy _all_ info across */
dest->niftiptr = nifti_copy_nim_info(src->niftiptr);
/* restore old values */
if (preserve_nifti_values) {
dest->niftiptr->data = data;
} else {
/* destroy the values that the nifti copy creates */
free(dest->niftiptr->fname);
free(dest->niftiptr->iname);
nifti_free_extensions(dest->niftiptr);
dest->niftiptr->fname = NULL;
dest->niftiptr->iname = NULL;
dest->niftiptr->data = NULL; /* should already be NULL */
}
FslSetFileType(dest,filetype);
FslSetWriteMode(dest,writemode);
}
if (src->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
int fsl_fileexists(const char* fname)
{
znzFile fp;
fp = znzopen( fname , "rb" , 1 ) ;
if( !znz_isnull(fp) ) { znzclose(fp); return 1; }
return 0;
}
int FslCheckForMultipleFileNames(const char* filename)
{
char *basename, *tmpname;
int singlecount=0, hdrcount=0, imgcount=0, ambiguous=0;
basename = nifti_makebasename(filename);
tmpname = (char *)calloc(strlen(basename) + 10,sizeof(char));
strcpy(tmpname,basename);
strcat(tmpname,".nii");
if (fsl_fileexists(tmpname)) { singlecount++; }
strcpy(tmpname,basename);
strcat(tmpname,".nii.gz");
if (fsl_fileexists(tmpname)) { singlecount++; }
strcpy(tmpname,basename);
strcat(tmpname,".mnc");
if (fsl_fileexists(tmpname)) { singlecount++; }
strcpy(tmpname,basename);
strcat(tmpname,".mnc.gz");
if (fsl_fileexists(tmpname)) { singlecount++; }
strcpy(tmpname,basename);
strcat(tmpname,".img");
if (fsl_fileexists(tmpname)) { imgcount++; }
strcpy(tmpname,basename);
strcat(tmpname,".img.gz");
if (fsl_fileexists(tmpname)) { imgcount++; }
strcpy(tmpname,basename);
strcat(tmpname,".hdr");
if (fsl_fileexists(tmpname)) { hdrcount++; }
strcpy(tmpname,basename);
strcat(tmpname,".hdr.gz");
if (fsl_fileexists(tmpname)) { hdrcount++; }
ambiguous = 1;
if ( (hdrcount==1) && (imgcount==1) && (singlecount==0) ) { ambiguous=0; }
if ( (hdrcount==0) && (imgcount==0) && (singlecount==1) ) { ambiguous=0; }
/* treat no image found as not ambiguous - want opening errors instead */
if ( (hdrcount==0) && (imgcount==0) && (singlecount==0) ) { ambiguous=0; }
free(tmpname);
free(basename);
return ambiguous;
}
int check_for_multiple_filenames(const char* filename)
{
char *basename, *tmpname;
char *otype;
if (FslCheckForMultipleFileNames(filename))
{ /* take action */
basename = nifti_makebasename(filename);
tmpname = (char *)calloc(strlen(basename) + 10,sizeof(char));
fprintf(stderr,"\n\n\nWARNING!!!! Multiple image files detected:\n");
/* list the offending files */
strcpy(tmpname,basename);
strcat(tmpname,".nii");
if (fsl_fileexists(tmpname)) { fprintf(stderr,"%s ",tmpname); }
strcpy(tmpname,basename);
strcat(tmpname,".nii.gz");
if (fsl_fileexists(tmpname)) { fprintf(stderr,"%s ",tmpname); }
strcpy(tmpname,basename);
strcat(tmpname,".mnc");
if (fsl_fileexists(tmpname)) { fprintf(stderr,"%s ",tmpname); }
strcpy(tmpname,basename);
strcat(tmpname,".mnc.gz");
if (fsl_fileexists(tmpname)) { fprintf(stderr,"%s ",tmpname); }
strcpy(tmpname,basename);
strcat(tmpname,".img");
if (fsl_fileexists(tmpname)) { fprintf(stderr,"%s ",tmpname); }
strcpy(tmpname,basename);
strcat(tmpname,".img.gz");
if (fsl_fileexists(tmpname)) { fprintf(stderr,"%s ",tmpname); }
strcpy(tmpname,basename);
strcat(tmpname,".hdr");
if (fsl_fileexists(tmpname)) { fprintf(stderr,"%s ",tmpname); }
strcpy(tmpname,basename);
strcat(tmpname,".hdr.gz");
if (fsl_fileexists(tmpname)) { fprintf(stderr,"%s ",tmpname); }
fprintf(stderr,"\n\n");
if (!FslIgnoreMFQ) {
otype = getenv("FSLMULTIFILEQUIT");
if (otype!=NULL) {
fprintf(stderr,"STOPPING PROGRAM\n");
exit(EXIT_FAILURE);
}
}
return 1;
}
return 0;
}
/***************************************************************
* FslOpen
***************************************************************/
/*! \fn FSLIO *FslOpen(const char *filename, const char *opts)
\brief Opens a file for either reading or writing.
The format of the output dataset is determined automatically by
passing filetype -1 to FslXOpen.
\sa FslXOpen
*/
FSLIO *FslOpen(const char *filename, const char *opts)
{
/* Note: -1 for filetype indicates that FslXOpen should determine filetype for itself */
return FslXOpen(filename,opts,-1);
}
/***************************************************************
* FslXOpen
***************************************************************/
/*! \fn FSLIO *FslXOpen(const char *filename, const char *opts, int filetype)
\brief Opens a file for either reading or writing
Files to be read are automatically read whether
compressed or not. Also, reading uses the file extension
and will fail if that file does not exist.
For a more robust read, pass the basename in as then all types
will be tried.
\param filename Name (or basename) of the file to open
\param opts Flags for fopen() of dataset, eg "r", "wb", etc.
\param filetype specifies the type of file to be written. Legal
values are as defined by FSL_TYPE. If filetype is less than
zero, then it is ignored and the type is determined by the
filename extension or, failing that, the environment default.
\return pointer to FSLIO dataset datastructure
\sa FSLIO
\sa FSL_TYPE
*/
FSLIO *FslXOpen(const char *filename, const char *opts, int filetype)
{
FSLIO *fslio;
char bopts[1024];
size_t i, bi;
int imgtype;
fslio = FslInit();
bi=0;
for(i=0;i<strlen(opts);i++) {
if (opts[i]=='w') { FslSetWriteMode(fslio,1); }
if (opts[i]!='b' && opts[i]!='t') { bopts[bi++]=opts[i]; }
}
/* add in 'b' (at the end) for windows compatibility */
bopts[bi++]='b';
bopts[bi]='\0';
if (FslGetWriteMode(fslio)==1) {
/** ====================== Open file for writing ====================== **/
FslInit4Write(fslio,filename,filetype);
imgtype = FslGetFileType(fslio);
fslio->written_hdr = 0;
/* open the image file - not the header */
fslio->fileptr = znzopen(fslio->niftiptr->iname,bopts,FslIsCompressedFileType(imgtype));
if (znz_isnull(fslio->fileptr)) {
fprintf(stderr,"Error: failed to open file %s\n",fslio->niftiptr->iname);
return NULL;
}
if (!FslIsSingleFileType(imgtype)) {
/* set up pointer at end of iname_offset for dual file formats (not singles) */
FslSeekVolume(fslio,0);
}
return fslio;
}
/** ======================== Open file for reading ====================== **/
check_for_multiple_filenames(filename);
/* see if the extension indicates a minc file */
imgtype = FslFileType(filename);
if ((imgtype>=0) && (FslBaseFileType(imgtype)==FSL_TYPE_MINC)) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
return NULL;
}
/* otherwise open nifti file: read header and open img file (may be same file) */
fslio->fileptr = nifti_image_open(filename,bopts,&(fslio->niftiptr));
if (znz_isnull(fslio->fileptr)) {
fprintf(stderr,"Error: failed to open file %s\n",filename);
return NULL;
}
/* set the file type given what has been read - it uses nifti_type and filenames */
imgtype = FslGetReadFileType(fslio);
FslSetFileType(fslio,imgtype);
FslSetWriteMode(fslio,0);
if (FslBaseFileType(FslGetFileType(fslio))==FSL_TYPE_ANALYZE) {
/* For the ANALYZE case in FSL, must cheat and grab the originator field! */
/* Note that the header file is always separate here and closed by now */
struct dsr ahdr;
short orig[5];
FslReadRawHeader(&ahdr,fslio->niftiptr->fname);
if (fslio->niftiptr->byteorder != nifti_short_order()) {
AvwSwapHeader(&ahdr);
}
/* Read the origin and set the sform up (if origin is non-zero) */
/* Note that signed pixdims are passed in to set the LR orientation */
memcpy(orig,&(ahdr.hist.originator),10);
FslSetAnalyzeSform(fslio, orig, fslio->niftiptr->pixdim[1],
fslio->niftiptr->pixdim[2], fslio->niftiptr->pixdim[3]);
}
/* from now on force all vox dims to be positive - LR info is in sform */
if (fslio->niftiptr!=NULL) {
fslio->niftiptr->dx = fabs(fslio->niftiptr->dx);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?