Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
mri_write_analyze.c
Go to the documentation of this file.00001 #include "mrilib.h"
00002 #include "mayo_analyze.h"
00003
00004 #if 0
00005
00006
00007 static void swap_4(void *ppp)
00008 {
00009 unsigned char *pntr = (unsigned char *) ppp ;
00010 unsigned char b0, b1, b2, b3;
00011
00012 b0 = *pntr; b1 = *(pntr+1); b2 = *(pntr+2); b3 = *(pntr+3);
00013 *pntr = b3; *(pntr+1) = b2; *(pntr+2) = b1; *(pntr+3) = b0;
00014 }
00015
00016
00017
00018 static void swap_8(void *ppp)
00019 {
00020 unsigned char *pntr = (unsigned char *) ppp ;
00021 unsigned char b0, b1, b2, b3;
00022 unsigned char b4, b5, b6, b7;
00023
00024 b0 = *pntr ; b1 = *(pntr+1); b2 = *(pntr+2); b3 = *(pntr+3);
00025 b4 = *(pntr+4); b5 = *(pntr+5); b6 = *(pntr+6); b7 = *(pntr+7);
00026
00027 *pntr = b7; *(pntr+1) = b6; *(pntr+2) = b5; *(pntr+3) = b4;
00028 *(pntr+4) = b3; *(pntr+5) = b2; *(pntr+6) = b1; *(pntr+7) = b0;
00029 }
00030
00031
00032
00033 static void swap_2(void *ppp)
00034 {
00035 unsigned char *pntr = (unsigned char *) ppp ;
00036 unsigned char b0, b1;
00037
00038 b0 = *pntr; b1 = *(pntr+1);
00039 *pntr = b1; *(pntr+1) = b0;
00040 }
00041
00042
00043
00044 static void swap_analyze_hdr( struct dsr *pntr )
00045 {
00046 swap_4(&pntr->hk.sizeof_hdr) ;
00047 swap_4(&pntr->hk.extents) ;
00048 swap_2(&pntr->hk.session_error) ;
00049 swap_2(&pntr->dime.dim[0]) ;
00050 swap_2(&pntr->dime.dim[1]) ;
00051 swap_2(&pntr->dime.dim[2]) ;
00052 swap_2(&pntr->dime.dim[3]) ;
00053 swap_2(&pntr->dime.dim[4]) ;
00054 swap_2(&pntr->dime.dim[5]) ;
00055 swap_2(&pntr->dime.dim[6]) ;
00056 swap_2(&pntr->dime.dim[7]) ;
00057 #if 0
00058 swap_2(&pntr->dime.unused1) ;
00059 #endif
00060 swap_2(&pntr->dime.datatype) ;
00061 swap_2(&pntr->dime.bitpix) ;
00062 swap_4(&pntr->dime.pixdim[0]) ;
00063 swap_4(&pntr->dime.pixdim[1]) ;
00064 swap_4(&pntr->dime.pixdim[2]) ;
00065 swap_4(&pntr->dime.pixdim[3]) ;
00066 swap_4(&pntr->dime.pixdim[4]) ;
00067 swap_4(&pntr->dime.pixdim[5]) ;
00068 swap_4(&pntr->dime.pixdim[6]) ;
00069 swap_4(&pntr->dime.pixdim[7]) ;
00070 swap_4(&pntr->dime.vox_offset) ;
00071 swap_4(&pntr->dime.funused1) ;
00072 swap_4(&pntr->dime.funused2) ;
00073 swap_4(&pntr->dime.cal_max) ;
00074 swap_4(&pntr->dime.cal_min) ;
00075 swap_4(&pntr->dime.compressed) ;
00076 swap_4(&pntr->dime.verified) ;
00077 swap_2(&pntr->dime.dim_un0) ;
00078 swap_4(&pntr->dime.glmax) ;
00079 swap_4(&pntr->dime.glmin) ;
00080 return ;
00081 }
00082 #endif
00083
00084
00085
00086
00087
00088
00089
00090 void mri_write_analyze( char *fname , MRI_IMAGE *im )
00091 {
00092 struct dsr hdr ;
00093 void *ip ;
00094 FILE *fp ;
00095 char *fff ;
00096
00097 ENTRY("mri_write_analyze") ;
00098
00099
00100
00101 if( fname == NULL || fname[0] == '\0' || im == NULL ) EXRETURN ;
00102 ip = mri_data_pointer(im) ;
00103
00104
00105
00106 memset( &hdr , 0 , sizeof(struct dsr) ) ;
00107
00108
00109
00110 hdr.hk.sizeof_hdr = sizeof(struct dsr) ;
00111 hdr.hk.regular = 'r' ;
00112
00113 sprintf( hdr.hk.db_name , "%.17s" , fname ) ;
00114 #if 0
00115 sprintf( hdr.hist.descrip , "via AFNI: %.68s" , fname ) ;
00116 #endif
00117
00118
00119
00120 hdr.dime.dim[0] = MRI_DIMENSIONALITY(im) ;
00121 hdr.dime.dim[1] = im->nx ; hdr.dime.pixdim[1] = im->dx ;
00122 hdr.dime.dim[2] = im->ny ; hdr.dime.pixdim[2] = im->dy ;
00123 hdr.dime.dim[3] = im->nz ; hdr.dime.pixdim[3] = im->dz ;
00124 hdr.dime.dim[4] = im->nt ; hdr.dime.pixdim[4] = im->dt ;
00125 hdr.dime.dim[5] = im->nu ; hdr.dime.pixdim[5] = im->du ;
00126 hdr.dime.dim[6] = im->nv ; hdr.dime.pixdim[6] = im->dv ;
00127 hdr.dime.dim[7] = im->nw ; hdr.dime.pixdim[7] = im->dw ;
00128
00129 hdr.dime.funused1 = 1.0 ;
00130
00131
00132
00133 switch( im->kind ){
00134
00135 default: EXRETURN ;
00136
00137 case MRI_byte: hdr.dime.datatype = ANDT_UNSIGNED_CHAR; break;
00138 case MRI_short: hdr.dime.datatype = ANDT_SIGNED_SHORT ; break;
00139 case MRI_int: hdr.dime.datatype = ANDT_SIGNED_INT ; break;
00140 case MRI_float: hdr.dime.datatype = ANDT_FLOAT ; break;
00141 case MRI_complex: hdr.dime.datatype = ANDT_COMPLEX ; break;
00142 case MRI_double: hdr.dime.datatype = ANDT_DOUBLE ; break;
00143 case MRI_rgb: hdr.dime.datatype = ANDT_RGB ; break;
00144 }
00145
00146 hdr.dime.bitpix = 8*im->pixel_size ;
00147
00148 if( ip != NULL ){
00149 hdr.dime.glmin = mri_min( im ) ;
00150 hdr.dime.glmax = mri_max( im ) ;
00151 } else {
00152 hdr.dime.glmin = 0.0 ;
00153 hdr.dime.glmax = 0.0 ;
00154 }
00155
00156
00157
00158
00159
00160
00161 if( AFNI_yesenv("AFNI_ANALYZE_ORIGINATOR") ){
00162 short xyzuv[5] = {0};
00163 xyzuv[0] = -im->xo/im->dx + 1.5;
00164 xyzuv[1] = -im->yo/im->dy + 1.5;
00165 xyzuv[2] = -im->zo/im->dz + 1.5;
00166 memcpy( hdr.hist.originator, xyzuv, 10 );
00167 }
00168
00169
00170
00171 fff = AFMALL(char, strlen(fname)+16 ) ;
00172
00173 sprintf(fff,"%s.hdr",fname) ;
00174 fp = fopen( fff , "wb" ) ;
00175 if( fp == NULL ){
00176 fprintf(stderr,"** Can't open file %s for output!\n",fff) ;
00177 free(fff) ; EXRETURN ;
00178 }
00179 fwrite( &hdr , sizeof(struct dsr) , 1 , fp ) ;
00180 fclose(fp) ;
00181
00182 if( ip == NULL ){
00183 free(fff); EXRETURN;
00184 }
00185
00186
00187
00188 sprintf(fff,"%s.img",fname) ;
00189 fp = fopen( fff , "wb" ) ;
00190 if( fp == NULL ){
00191 fprintf(stderr,"** Can't open file %s for output!\n",fff) ;
00192 free(fff) ; EXRETURN ;
00193 }
00194 fwrite( ip , im->nvox , im->pixel_size , fp ) ;
00195 fclose(fp) ;
00196
00197 free(fff) ; EXRETURN ;
00198 }