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 } |