Doxygen Source Code Documentation
mri_read_stuff.c File Reference
#include "mrilib.h"#include <signal.h>Go to the source code of this file.
Defines | |
| #define | QBUF 4096 |
| #define | SKIPCOM |
| #define | NUMSCAN(var) |
Functions | |
| MRI_IMAGE * | mri_read_stuff (char *fname) |
| void | mri_inflate_pbm (MRI_IMAGE *im) |
Define Documentation
|
|
Value: |
|
|
Definition at line 5 of file mri_read_stuff.c. Referenced by mri_read_stuff(). |
|
|
Value: { if(buf[ipos]=='#') \
do{ ipos++; } while( ipos<nbuf && buf[ipos]!='\n' ) ; } |
Function Documentation
|
|
Inflate data from PBM to PGM, in place. ---------------------------------------------------------------------------- Definition at line 234 of file mri_read_stuff.c. References ENTRY, MRI_IMAGE::kind, MRI_BYTE_PTR, mri_free(), mri_new(), MRI_IMAGE::nx, and MRI_IMAGE::ny. Referenced by mri_read_stuff().
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 }
|
|
|
Definition at line 7 of file mri_read_stuff.c. References AFMALL, ENTRY, free, maxval, mri_add_name(), MRI_BYTE_PTR, mri_inflate_pbm(), mri_new(), MRI_RGB_PTR, NUMSCAN, pclose, popen, QBUF, RETURN, and THD_find_executable(). Referenced by AFNI_faceup(), AFNI_splashup(), mri_read(), and mri_read_file().
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 }
|