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 }