Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
mri_read_stuff.c
Go to the documentation of this file.00001 #include "mrilib.h"
00002 #include <signal.h>
00003
00004 #undef QBUF
00005 #define QBUF 4096
00006
00007 MRI_IMAGE * mri_read_stuff( char *fname )
00008 {
00009 static int first=1 ;
00010 static char *jpeg_filter = NULL ;
00011 static char *gif_filter = NULL ;
00012 static char *tiff_filter = NULL ;
00013 static char *bmp_filter = NULL ;
00014 static char *png_filter = NULL ;
00015 static char *pnm_filter = NULL ;
00016
00017 char *pg , *pg2 , *filt=NULL ;
00018 int nf , nbuf , ipos , nx,ny,maxval=255 , bper,nbim, pbm=0 ;
00019 FILE *fp ;
00020 MRI_IMAGE *im ;
00021 byte *imar , *buf ;
00022
00023 ENTRY("mri_read_stuff") ;
00024
00025
00026
00027 if( fname == NULL || *fname == '\0' ) RETURN(NULL) ;
00028
00029
00030
00031 if( first ){
00032 first = 0 ;
00033
00034 pg = THD_find_executable( "cat" ) ;
00035 if( pg != NULL ){
00036 pnm_filter = AFMALL(char, strlen(pg)+32) ;
00037 sprintf( pnm_filter , "%s %%s" , pg ) ;
00038 }
00039
00040 pg = THD_find_executable( "djpeg" ) ;
00041 if( pg != NULL ){
00042 jpeg_filter = AFMALL(char, strlen(pg)+32) ;
00043 sprintf( jpeg_filter , "%s %%s" , pg ) ;
00044 }
00045
00046 pg = THD_find_executable( "giftopnm" ) ;
00047 if( pg != NULL ){
00048 gif_filter = AFMALL(char, strlen(pg)+32) ;
00049 sprintf( gif_filter , "%s %%s" , pg ) ;
00050 }
00051
00052 pg = THD_find_executable( "tifftopnm" ) ;
00053 if( pg != NULL ){
00054 tiff_filter = AFMALL(char, strlen(pg)+32) ;
00055 sprintf( tiff_filter , "%s %%s" , pg ) ;
00056 }
00057
00058 pg = THD_find_executable( "bmptoppm" ) ;
00059 if( pg != NULL ){
00060 bmp_filter = AFMALL(char, strlen(pg)+32) ;
00061 sprintf( bmp_filter , "%s %%s" , pg ) ;
00062 }
00063
00064 pg = THD_find_executable( "pngtopnm" ) ;
00065 if( pg != NULL ){
00066 png_filter = AFMALL(char, strlen(pg)+32) ;
00067 sprintf( png_filter , "%s %%s" , pg ) ;
00068 }
00069 }
00070
00071
00072
00073 nf = strlen(fname) ;
00074 if( nf < 5 ) RETURN(NULL);
00075
00076 pg = fname + (nf-4);
00077 pg2 = pg - 1;
00078
00079 if( strcmp(pg ,".jpg" ) == 0 ||
00080 strcmp(pg ,".JPG" ) == 0 ||
00081 strcmp(pg2,".jpeg") == 0 ||
00082 strcmp(pg2,".JPEG") == 0 ) filt = jpeg_filter ;
00083
00084 else if( strcmp(pg ,".gif" ) == 0 ||
00085 strcmp(pg ,".GIF" ) == 0 ) filt = gif_filter ;
00086
00087 else if( strcmp(pg ,".pbm" ) == 0 ||
00088 strcmp(pg ,".PBM" ) == 0 ||
00089 strcmp(pg ,".pgm" ) == 0 ||
00090 strcmp(pg ,".PGM" ) == 0 ||
00091 strcmp(pg ,".ppm" ) == 0 ||
00092 strcmp(pg ,".PPM" ) == 0 ) filt = pnm_filter ;
00093
00094 else if( strcmp(pg ,".tif" ) == 0 ||
00095 strcmp(pg ,".TIF" ) == 0 ||
00096 strcmp(pg2,".tiff") == 0 ||
00097 strcmp(pg2,".TIFF") == 0 ) filt = tiff_filter ;
00098
00099 else if( strcmp(pg ,".bmp" ) == 0 ||
00100 strcmp(pg ,".BMP" ) == 0 ) filt = bmp_filter ;
00101
00102 else if( strcmp(pg ,".png" ) == 0 ||
00103 strcmp(pg ,".PNG" ) == 0 ) filt = png_filter ;
00104
00105 if( filt == NULL ) RETURN(NULL);
00106
00107
00108
00109 pg = AFMALL(char, nf+strlen(filt)+32) ;
00110 sprintf( pg , filt , fname ) ;
00111
00112 signal( SIGPIPE , SIG_IGN ) ;
00113 fp = popen( pg , "r" ) ;
00114 if( fp == NULL ){ free(pg); RETURN(NULL); }
00115
00116 buf = AFMALL(byte, QBUF) ;
00117
00118
00119
00120 nbuf = fread( buf , 1 , QBUF , fp ) ;
00121
00122 if( nbuf < 16 ){
00123 free(buf); free(pg); pclose(fp); RETURN(NULL);
00124 }
00125
00126 if( buf[0] != 'P' ){
00127 free(buf); free(pg); pclose(fp); RETURN(NULL);
00128 }
00129
00130 if( buf[1] == '6' ) bper = 3 ;
00131 else if( buf[1] == '5' ) bper = 1 ;
00132 else if( buf[1] == '4' ){bper = 1 ; pbm=1; }
00133 else {
00134 free(buf); free(pg); pclose(fp); RETURN(NULL);
00135 }
00136
00137 ipos = 2 ;
00138
00139
00140
00141 #undef SKIPCOM
00142 #define SKIPCOM \
00143 { if(buf[ipos]=='#') \
00144 do{ ipos++; } while( ipos<nbuf && buf[ipos]!='\n' ) ; }
00145
00146
00147
00148 #undef NUMSCAN
00149 #define NUMSCAN(var) \
00150 { SKIPCOM ; \
00151 while( ipos<nbuf && !isdigit(buf[ipos]) ){ipos++; SKIPCOM;} \
00152 if( ipos >= nbuf ){ var = -1; } \
00153 else { \
00154 int nch; char chb[32]; \
00155 for( nch=0 ; ipos<nbuf && isdigit(buf[ipos]) ; nch++,ipos++ ){ \
00156 chb[nch] = buf[ipos]; } \
00157 chb[nch]='\0'; var = strtol(chb,NULL,10); \
00158 } }
00159
00160
00161
00162 NUMSCAN(nx) ;
00163 if( nx < 2 || ipos >= nbuf ){
00164 free(buf); free(pg); pclose(fp); RETURN(NULL);
00165 }
00166
00167
00168
00169 NUMSCAN(ny) ;
00170 if( ny < 2 || ipos >= nbuf ){
00171 free(buf); free(pg); pclose(fp); RETURN(NULL);
00172 }
00173
00174
00175
00176 if( !pbm ){
00177 NUMSCAN(maxval) ;
00178 if( maxval <= 0 || maxval > 255 || ipos >= nbuf ){
00179 free(buf); free(pg); pclose(fp); RETURN(NULL);
00180 }
00181 }
00182
00183 ipos++ ;
00184
00185
00186
00187
00188 if( bper == 3 ){
00189 im = mri_new( nx , ny , MRI_rgb ) ;
00190 imar = MRI_RGB_PTR(im) ;
00191 } else {
00192 im = mri_new( nx , ny , MRI_byte ) ;
00193 imar = MRI_BYTE_PTR(im) ;
00194 }
00195 mri_add_name( fname , im ) ;
00196 nbim = bper * nx * ny ;
00197
00198
00199
00200 nbuf = nbuf - ipos ;
00201 if( nbuf > nbim ) nbuf = nbim ;
00202 if( nbuf > 0 )
00203 memcpy( imar , buf+ipos , nbuf ) ;
00204
00205 free(buf) ;
00206
00207
00208
00209 if( nbuf < nbim )
00210 fread( imar+nbuf , 1 , nbim-nbuf , fp ) ;
00211
00212 free(pg) ; pclose(fp) ;
00213
00214
00215
00216 if( pbm ) mri_inflate_pbm( im ) ;
00217
00218
00219
00220 if( maxval < 255 ){
00221 int ii ; float fac = 255.4/maxval ;
00222 for( ii=0 ; ii < nbim ; ii++ ) imar[ii] = (byte)( imar[ii]*fac ) ;
00223 }
00224
00225
00226
00227 RETURN(im);
00228 }
00229
00230
00231
00232
00233
00234 void mri_inflate_pbm( MRI_IMAGE *im )
00235 {
00236 MRI_IMAGE *qim ;
00237 byte *qimar , *imar ;
00238 int ii,jj , nx,ny , nbrow , i8 ;
00239 byte bmask[8] = { 1<<7 , 1<<6 , 1<<5 , 1<<4 , 1<<3 , 1<<2 , 1<<1 , 1 } ;
00240
00241 ENTRY("mri_inflate_pbm") ;
00242
00243 if( im == NULL || im->kind != MRI_byte ) EXRETURN ;
00244
00245 nx = im->nx ; ny = im->ny ;
00246 qim = mri_new( nx , ny , MRI_byte ) ;
00247 qimar = MRI_BYTE_PTR(qim) ;
00248 imar = MRI_BYTE_PTR(im) ;
00249
00250 nbrow = nx/8 ; if( 8*nbrow < nx ) nbrow++ ;
00251
00252 for( jj=0 ; jj < ny ; jj++ )
00253 for( ii=0 ; ii < nx ; ii++ ){
00254 i8 = ii >> 3 ;
00255 qimar[ii+jj*nx] = ( imar[(i8)+jj*nbrow] & bmask[ii&7] ) != 0 ;
00256 }
00257
00258 memcpy( imar , qimar , nx*ny ) ; mri_free( qim ) ;
00259 EXRETURN ;
00260 }