fslio.c
来自「DTMK软件开发包,此为开源软件,是一款很好的医学图像开发资源.」· C语言 代码 · 共 1,842 行 · 第 1/5 页
C
1,842 行
size_t volbytes, offset, orig_offset;
size_t n;
short xdim,ydim,zdim,v,wordsize;
if (fslio==NULL) FSLIOERR("FslReadTimeSeries: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
FslGetDim(fslio,&xdim,&ydim,&zdim,&v);
if ((xVox<0) || (xVox >=xdim)) FSLIOERR("FslReadTimeSeries: voxel outside valid range");
if ((yVox<0) || (yVox >=ydim)) FSLIOERR("FslReadTimeSeries: voxel outside valid range");
if ((zVox<0) || (zVox >=zdim)) FSLIOERR("FslReadTimeSeries: voxel outside valid range");
wordsize = fslio->niftiptr->nbyper;
volbytes = xdim * ydim * zdim * wordsize;
orig_offset = znztell(fslio->fileptr);
offset = ((ydim * zVox + yVox) * xdim + xVox) * wordsize;
znzseek(fslio->fileptr,offset,SEEK_CUR);
for (n=0; n<nvols; n++) {
if (n>0) znzseek(fslio->fileptr, volbytes - wordsize, SEEK_CUR);
if (znzread((char *)buffer+(n*wordsize), 1, wordsize,fslio->fileptr) != wordsize)
FSLIOERR("FslReadTimeSeries: failed to read values");
if (fslio->niftiptr->byteorder != nifti_short_order())
nifti_swap_Nbytes(1,fslio->niftiptr->swapsize,
(char *)buffer+(n*wordsize));
}
/* restore file pointer to original position */
znzseek(fslio->fileptr,orig_offset,SEEK_SET);
return n;
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
return 0;
}
size_t FslReadCplxVolumes(FSLIO *fslio, void *buffer, size_t nvols, char mode)
{
if (fslio==NULL) FSLIOERR("FslReadCplxVolumes: Null pointer passed for FSLIO");
fprintf(stderr,"Warning:: FslReadCplxVolumes is not yet supported\n");
return 0;
}
size_t FslWriteCplxVolumes(FSLIO *fslio, void *buffer, size_t nvols, char mode)
{
if (fslio==NULL) FSLIOERR("FslWriteCplxVolumes: Null pointer passed for FSLIO");
fprintf(stderr,"Warning:: FslWriteCplxVolumes is not yet supported\n");
return 0;
}
int FslSeekVolume(FSLIO *fslio, size_t vols)
{
int offset;
if (fslio==NULL) FSLIOERR("FslSeekVolume: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
offset = fslio->niftiptr->iname_offset +
vols * FslGetVolSize(fslio) * fslio->niftiptr->nbyper;
if (znz_isnull(fslio->fileptr)) FSLIOERR("FslSeekVolume: Null file pointer");
return znzseek(fslio->fileptr,offset,SEEK_SET);
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
return 0;
}
size_t FslGetVolSize(FSLIO *fslio)
{
/* returns number of voxels per 3D volume */
if (fslio==NULL) FSLIOERR("FslGetVolSize: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
return (fslio->niftiptr->nx * fslio->niftiptr->ny * fslio->niftiptr->nz);
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
return 0;
}
void FslSetDim(FSLIO *fslio, short x, short y, short z, short v)
{
int ndim;
if (fslio==NULL) FSLIOERR("FslSetDim: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
ndim=4;
if (v<=1) {ndim--; if (z<=1) {ndim--; if (y<=1) {ndim--; if (x<=1) {ndim--;}}}}
fslio->niftiptr->ndim = ndim;
if (x>=1) fslio->niftiptr->nx = x; else fslio->niftiptr->nx=1;
if (y>=1) fslio->niftiptr->ny = y; else fslio->niftiptr->ny=1;
if (z>=1) fslio->niftiptr->nz = z; else fslio->niftiptr->nz=1;
if (v>=1) fslio->niftiptr->nt = v; else fslio->niftiptr->nt=1;
fslio->niftiptr->nu = 1;
fslio->niftiptr->nv = 1;
fslio->niftiptr->nw = 1;
/* deal with stupid redundancies */
fslio->niftiptr->dim[0] = fslio->niftiptr->ndim ;
fslio->niftiptr->dim[1] = fslio->niftiptr->nx;
fslio->niftiptr->dim[2] = fslio->niftiptr->ny;
fslio->niftiptr->dim[3] = fslio->niftiptr->nz;
fslio->niftiptr->dim[4] = fslio->niftiptr->nt;
fslio->niftiptr->dim[5] = fslio->niftiptr->nu;
fslio->niftiptr->dim[6] = fslio->niftiptr->nv;
fslio->niftiptr->dim[7] = fslio->niftiptr->nw;
fslio->niftiptr->nvox = fslio->niftiptr->nx * fslio->niftiptr->ny * fslio->niftiptr->nz
* fslio->niftiptr->nt * fslio->niftiptr->nu * fslio->niftiptr->nv * fslio->niftiptr->nw ;
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
void FslGetDim(FSLIO *fslio, short *x, short *y, short *z, short *v)
{
if (fslio==NULL) FSLIOERR("FslGetDim: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
*x = fslio->niftiptr->nx;
*y = fslio->niftiptr->ny;
*z = fslio->niftiptr->nz;
*v = fslio->niftiptr->nt;
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
void FslSetDimensionality(FSLIO *fslio, size_t dim)
{
if (fslio==NULL) FSLIOERR("FslSetDimensionality: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
fslio->niftiptr->ndim = dim;
fslio->niftiptr->dim[0] = dim;
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
void FslGetDimensionality(FSLIO *fslio, size_t *dim)
{
if (fslio==NULL) FSLIOERR("FslGetDimensionality: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
*dim = fslio->niftiptr->ndim;
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
void FslSetVoxDim(FSLIO *fslio, float x, float y, float z, float tr)
{
if (fslio==NULL) FSLIOERR("FslSetVoxDim: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
fslio->niftiptr->dx = fabs(x);
fslio->niftiptr->dy = fabs(y);
fslio->niftiptr->dz = fabs(z);
fslio->niftiptr->dt = fabs(tr);
fslio->niftiptr->pixdim[1] = fabs(x);
fslio->niftiptr->pixdim[2] = fabs(y);
fslio->niftiptr->pixdim[3] = fabs(z);
fslio->niftiptr->pixdim[4] = fabs(tr);
/* set the units to mm and seconds */
fslio->niftiptr->xyz_units = NIFTI_UNITS_MM;
fslio->niftiptr->time_units = NIFTI_UNITS_SEC;
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
void FslGetVoxDim(FSLIO *fslio, float *x, float *y, float *z, float *tr)
{
if (fslio==NULL) FSLIOERR("FslGetVoxDim: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
*x = fabs(fslio->niftiptr->dx);
*y = fabs(fslio->niftiptr->dy);
*z = fabs(fslio->niftiptr->dz);
*tr = fabs(fslio->niftiptr->dt);
/* now check the units and convert to mm and sec */
if (fslio->niftiptr->xyz_units == NIFTI_UNITS_METER)
{ *x *= 1000.0; *y *= 1000.0; *z *= 1000.0; }
if (fslio->niftiptr->xyz_units == NIFTI_UNITS_MICRON)
{ *x /= 1000.0; *y /= 1000.0; *z /= 1000.0; }
if (fslio->niftiptr->xyz_units == NIFTI_UNITS_MSEC)
{ *tr /= 1000.0; }
if (fslio->niftiptr->xyz_units == NIFTI_UNITS_USEC)
{ *tr /= 1000000.0; }
/* if it is Hz or other frequency then leave it */
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
void FslGetCalMinMax(FSLIO *fslio, float *min, float *max)
{
if (fslio==NULL) FSLIOERR("FslGetCalMinMax: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
*min = fslio->niftiptr->cal_min;
*max = fslio->niftiptr->cal_max;
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
void FslSetCalMinMax(FSLIO *fslio, float min, float max)
{
if (fslio==NULL) FSLIOERR("FslSetCalMinMax: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
fslio->niftiptr->cal_min = min;
fslio->niftiptr->cal_max = max;
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
void FslGetAuxFile(FSLIO *fslio,char *aux_file)
{
if (fslio==NULL) FSLIOERR("FslGetAuxFile: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
strncpy(aux_file,fslio->niftiptr->aux_file, 24);
aux_file[23] = '\0';
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
void FslSetAuxFile(FSLIO *fslio,const char *aux_file)
{
if (fslio==NULL) FSLIOERR("FslSetAuxFile: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
strncpy(fslio->niftiptr->aux_file, aux_file, 24);
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
void FslSetVoxUnits(FSLIO *fslio, const char *units)
{
int unitcode=0;
if (fslio==NULL) FSLIOERR("FslSetVoxUnits: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
if (strcmp(units,nifti_units_string(NIFTI_UNITS_METER))==0) {
unitcode = NIFTI_UNITS_METER;
} else if (strcmp(units,nifti_units_string(NIFTI_UNITS_MM))==0) {
unitcode = NIFTI_UNITS_MM;
} else if (strcmp(units,nifti_units_string(NIFTI_UNITS_MICRON))==0) {
unitcode = NIFTI_UNITS_MICRON;
}
fslio->niftiptr->xyz_units = unitcode;
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
void FslGetVoxUnits(FSLIO *fslio, char *units)
{
if (fslio==NULL) FSLIOERR("FslGetVoxUnits: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
strcpy(units,nifti_units_string(fslio->niftiptr->xyz_units));
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
void FslSetTimeUnits(FSLIO *fslio, const char *units)
{
int unitcode=0;
if (fslio==NULL) FSLIOERR("FslSetTimeUnits: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
if (strcmp(units,nifti_units_string(NIFTI_UNITS_HZ))==0) {
unitcode = NIFTI_UNITS_HZ;
} else if (strcmp(units,nifti_units_string(NIFTI_UNITS_PPM))==0) {
unitcode = NIFTI_UNITS_PPM;
} else if (strcmp(units,nifti_units_string(NIFTI_UNITS_RADS))==0) {
unitcode = NIFTI_UNITS_RADS;
} else if (strcmp(units,nifti_units_string(NIFTI_UNITS_SEC))==0) {
unitcode = NIFTI_UNITS_SEC;
} else if (strcmp(units,nifti_units_string(NIFTI_UNITS_MSEC))==0) {
fprintf(stderr,"Warning::Setting time units to msec is not fully recommended in fslio\n");
unitcode = NIFTI_UNITS_MSEC;
} else if (strcmp(units,nifti_units_string(NIFTI_UNITS_USEC))==0) {
fprintf(stderr,"Warning::Setting time units to msec is not fully recommended in fslio\n");
unitcode = NIFTI_UNITS_USEC;
}
fslio->niftiptr->time_units = unitcode;
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
void FslGetTimeUnits(FSLIO *fslio, char *units)
{
if (fslio==NULL) FSLIOERR("FslGetTimeUnits: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
strcpy(units,nifti_units_string(fslio->niftiptr->time_units));
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
void FslSetDataType(FSLIO *fslio, short t)
{
int nbytepix=0, ss=0;
if (fslio==NULL) FSLIOERR("FslSetDataType: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
fslio->niftiptr->datatype = t;
nifti_datatype_sizes(t,&nbytepix,&ss);
fslio->niftiptr->nbyper = nbytepix;
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
}
size_t FslGetDataType(FSLIO *fslio, short *t)
{
/* returns bits per pixel */
int nbytepix=32, ss=0;
if (fslio==NULL) FSLIOERR("FslGetDataType: Null pointer passed for FSLIO");
if (fslio->niftiptr!=NULL) {
*t = fslio->niftiptr->datatype;
nifti_datatype_sizes(*t,&nbytepix,&ss);
}
if (fslio->mincptr!=NULL) {
fprintf(stderr,"Warning:: Minc is not yet supported\n");
}
return (size_t) 8 * nbytepix;
}
void FslGetMMCoord(mat44 stdmat, float voxx, float voxy, float voxz,
float *mmx, float *mmy, float *mmz)
{
*mmx = stdmat.m[0][0] * voxx + stdmat.m[0][1] * voxy + stdmat.m[0][2] * voxz
+ stdmat.m[0][3];
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?