Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

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 ;  /* djpeg     */
00011    static char *gif_filter  = NULL ;  /* giftopnm  */
00012    static char *tiff_filter = NULL ;  /* tifftopnm */
00013    static char *bmp_filter  = NULL ;  /* bmptoppm  */
00014    static char *png_filter  = NULL ;  /* pngtopnm  */
00015    static char *pnm_filter  = NULL ;  /* cat */
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    /*--- check input for OK-ness ---*/
00026 
00027    if( fname == NULL || *fname == '\0' ) RETURN(NULL) ;
00028 
00029    /*--- first time in, setup up filters to PNM format ---*/
00030 
00031    if( first ){
00032      first = 0 ;
00033 
00034      pg = THD_find_executable( "cat" ) ;    /* cheap, but works */
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    /*--- determine filter based on file suffix ---*/
00072 
00073    nf = strlen(fname) ;
00074    if( nf < 5 ) RETURN(NULL);  /* filename too short! */
00075 
00076    pg  = fname + (nf-4);       /* points to last 4 chars */
00077    pg2 = pg - 1;               /* points to last 5 chars */
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);  /* didn't match, or no filter */
00106 
00107    /*--- create the filter for this file and open the pipe ---*/
00108 
00109    pg = AFMALL(char, nf+strlen(filt)+32) ;  /* string to hold filter */
00110    sprintf( pg , filt , fname ) ;
00111 
00112    signal( SIGPIPE , SIG_IGN ) ;  /* ignore this signal */
00113    fp = popen( pg , "r" ) ;
00114    if( fp == NULL ){ free(pg); RETURN(NULL); }  /* bad pipe */
00115 
00116    buf = AFMALL(byte, QBUF) ;  /* read buffer for initial data from pipe */
00117 
00118    /*--- read 1st block from pipe ---*/
00119 
00120    nbuf = fread( buf , 1 , QBUF , fp ) ;
00121 
00122    if( nbuf < 16 ){  /* bad read */
00123      free(buf); free(pg); pclose(fp); RETURN(NULL);
00124    }
00125 
00126    if( buf[0] != 'P' ){  /* not a P?M file */
00127      free(buf); free(pg); pclose(fp); RETURN(NULL);
00128    }
00129 
00130         if( buf[1] == '6' ) bper = 3 ;              /* PPM from pipe */
00131    else if( buf[1] == '5' ) bper = 1 ;              /* PGM from pipe */
00132    else if( buf[1] == '4' ){bper = 1 ; pbm=1; }     /* PBM from pipe */
00133    else {
00134      free(buf); free(pg); pclose(fp); RETURN(NULL); /* bad bad bad!! */
00135    }
00136 
00137    ipos = 2 ;  /* start scanning for PNM header stuff at position 2 in buf */
00138 
00139    /* skip comment lines in the buffer */
00140 
00141 #undef  SKIPCOM
00142 #define SKIPCOM                                                     \
00143  { if(buf[ipos]=='#')                                               \
00144      do{ ipos++; } while( ipos<nbuf && buf[ipos]!='\n' ) ; }
00145 
00146    /* find an ASCII number in the buffer */
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   /* scan for the nx variable */
00161 
00162   NUMSCAN(nx) ;
00163   if( nx < 2 || ipos >= nbuf ){                      /* bad */
00164     free(buf); free(pg); pclose(fp); RETURN(NULL);
00165   }
00166 
00167   /* scan for the ny variable */
00168 
00169   NUMSCAN(ny) ;
00170   if( ny < 2 || ipos >= nbuf ){                      /* bad */
00171     free(buf); free(pg); pclose(fp); RETURN(NULL);
00172   }
00173 
00174   /* scan for the maxval variable */
00175 
00176   if( !pbm ){
00177     NUMSCAN(maxval) ;
00178     if( maxval <= 0 || maxval > 255 || ipos >= nbuf ){ /* bad */
00179       free(buf); free(pg); pclose(fp); RETURN(NULL);
00180     }
00181   }
00182 
00183   ipos++ ;   /* skip byte after maxval;                   */
00184              /* ipos now points at 1st byte of image data */
00185 
00186   /*--- create output image struct  ---*/
00187 
00188   if( bper == 3 ){                        /* PPM */
00189     im   = mri_new( nx , ny , MRI_rgb ) ;
00190     imar = MRI_RGB_PTR(im) ;
00191   } else {                                /* PGM or PBM */
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 ;        /* num bytes in image array imar */
00197 
00198   /*--- copy remaining data in buf (if any) to image array ---*/
00199 
00200   nbuf = nbuf - ipos ;             /* num bytes left in buf */
00201   if( nbuf > nbim ) nbuf = nbim ;  /* but don't want too much */
00202   if( nbuf > 0 )
00203     memcpy( imar , buf+ipos , nbuf ) ;
00204 
00205   free(buf) ;     /* have used this up now */
00206 
00207   /*--- read rest of image array directly from pipe ---*/
00208 
00209   if( nbuf < nbim )
00210     fread( imar+nbuf , 1 , nbim-nbuf , fp ) ;
00211 
00212   free(pg) ; pclose(fp) ;  /* toss out the trash */
00213 
00214   /*--- if was really a PBM image, inflate to PGM now ---*/
00215 
00216   if( pbm ) mri_inflate_pbm( im ) ;  /* 02 Jan 2003 */
00217 
00218   /*--- if maxval < 255, scale byte data up to that level ---*/
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   /*--- vamoose the ranch ---*/
00226 
00227   RETURN(im);
00228 }
00229 
00230 /*--------------------------------------------------------------------------*/
00231 /*! Inflate data from PBM to PGM, in place.
00232 ----------------------------------------------------------------------------*/
00233 
00234 void mri_inflate_pbm( MRI_IMAGE *im )  /* 02 Jan 2002 */
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 }
 

Powered by Plone

This site conforms to the following standards: