00001
00002
00003
00004
00005
00006
00007 #include "mrilib.h"
00008
00009
00010
00011
00012
00013
00014
00015 int mri_write( char *fname , MRI_IMAGE *im )
00016 {
00017 FILE *imfile ;
00018 void *data ;
00019 int dsize , noheader = FALSE ;
00020
00021 ENTRY("mri_write") ;
00022
00023
00024
00025 if( im == NULL || fname == NULL || *fname == '\0' ) RETURN(0) ;
00026
00027
00028
00029 if( ! MRI_IS_2D(im) ){ RETURN(mri_write_7D ( fname , im )) ; }
00030 if( im->kind == MRI_rgb ){ RETURN(mri_write_pnm( fname , im )) ; }
00031 if( im->kind == MRI_byte ){ RETURN(mri_write_pnm( fname , im )) ; }
00032
00033
00034
00035 if( strcmp(fname,"-") != 0 ){
00036 imfile = fopen( fname , "r" ) ;
00037 if( imfile != NULL ){
00038 fclose( imfile ) ;
00039 fprintf(stderr,"(FAILED) attempt to overwrite file %s\n",fname) ;
00040 RETURN(0) ;
00041 }
00042 }
00043
00044 if( strcmp(fname,"-") != 0 )
00045 imfile = fopen( fname , "w" ) ;
00046 else
00047 imfile = stdout ;
00048
00049 if( imfile == NULL ){
00050 fprintf( stderr , "couldn't open for output file %s\n" , fname ) ;
00051 RETURN(0) ;
00052 }
00053
00054
00055
00056 dsize = im->pixel_size * im->nx * im->ny ;
00057
00058 if( im->kind == MRI_short ){
00059 switch( dsize ){
00060 default: noheader = FALSE ; break ;
00061
00062 case 8192:
00063 case 32768:
00064 case 131072:
00065 case 524288:
00066 case 2097152:
00067 noheader = TRUE ;
00068 break ;
00069 }
00070 } else if( im->kind == MRI_byte ){
00071 switch( dsize ){
00072 default: noheader = FALSE ; break ;
00073
00074 case 4096:
00075 case 16384:
00076 case 65536:
00077 case 262144:
00078 case 1048576:
00079 noheader = TRUE ;
00080 break ;
00081 }
00082 }
00083
00084 if( !noheader ) fprintf( imfile , "MRI %d %d %d\n" ,
00085 im->kind , im->nx , im->ny ) ;
00086
00087
00088
00089 if( noheader && dsize == 131072 && im->kind == MRI_short ){
00090 #define HEADER (28*256)
00091 int ii ;
00092 short * qq ;
00093 qq = (short *) malloc(sizeof(short)*HEADER) ;
00094 for( ii=0 ; ii < HEADER ; ii++ ) qq[ii] = 0 ;
00095 fwrite( qq , sizeof(short) , HEADER , imfile ) ;
00096 free(qq) ;
00097 }
00098
00099
00100
00101 data = mri_data_pointer( im ) ;
00102 fwrite( data , im->pixel_size , im->nx * im->ny , imfile ) ;
00103
00104 if( imfile != stdout ) fclose( imfile ) ;
00105 RETURN(1) ;
00106 }
00107
00108
00109
00110 int mri_write_7D( char *fname , MRI_IMAGE *im )
00111 {
00112 FILE *imfile ;
00113 void *data ;
00114
00115 ENTRY("mri_write_7D") ;
00116
00117 if( im == NULL ) RETURN( 0 );
00118
00119 imfile = fopen( fname , "r" ) ;
00120 if( imfile != NULL ){
00121 fclose( imfile ) ;
00122 fprintf(stderr,"(FAILED) attempt to overwrite file %s\n",fname) ;
00123 RETURN( 0 );
00124 }
00125
00126 imfile = fopen( fname , "w" ) ;
00127
00128 if( imfile == NULL ){
00129 fprintf( stderr , "couldn't open for output file %s\n" , fname ) ;
00130 RETURN( 0 );
00131 }
00132
00133
00134
00135 switch( MRI_DIMENSIONALITY(im) ){
00136 default:
00137 case 1:
00138 fprintf( imfile , "MR1 %d %d\n" ,
00139 im->kind , im->nx ) ;
00140 break ;
00141
00142 case 2:
00143 fprintf( imfile , "MR2 %d %d %d\n" ,
00144 im->kind , im->nx,im->ny ) ;
00145 break ;
00146
00147 case 3:
00148 fprintf( imfile , "MR2 %d %d %d %d\n" ,
00149 im->kind , im->nx,im->ny,im->nz ) ;
00150 break ;
00151
00152 case 4:
00153 fprintf( imfile , "MR2 %d %d %d %d %d\n" ,
00154 im->kind , im->nx,im->ny,im->nz,im->nt ) ;
00155 break ;
00156
00157 case 5:
00158 fprintf( imfile , "MR2 %d %d %d %d %d %d\n" ,
00159 im->kind , im->nx,im->ny,im->nz,im->nt,im->nu ) ;
00160 break ;
00161
00162 case 6:
00163 fprintf( imfile , "MR2 %d %d %d %d %d %d %d\n" ,
00164 im->kind , im->nx,im->ny,im->nz,im->nt,im->nu,im->nv ) ;
00165 break ;
00166
00167 case 7:
00168 fprintf( imfile , "MR2 %d %d %d %d %d %d %d %d\n" ,
00169 im->kind , im->nx,im->ny,im->nz,im->nt,im->nu,im->nv,im->nw ) ;
00170 break ;
00171 }
00172
00173
00174
00175 data = mri_data_pointer( im ) ;
00176 fwrite( data , im->pixel_size , im->nvox , imfile ) ;
00177 fclose( imfile ) ;
00178
00179 RETURN( 1 );
00180 }
00181
00182
00183
00184 int mri_write_pnm( char *fname , MRI_IMAGE *im )
00185 {
00186 FILE *imfile ;
00187 void *data ;
00188 int dsize , noheader = FALSE ;
00189
00190 ENTRY("mri_write_pnm") ;
00191
00192 if( im == NULL ) RETURN( 0 );
00193 if( im->nz > 1 ) RETURN( 0 );
00194 if( im->kind != MRI_byte && im->kind != MRI_rgb ) RETURN( 0 );
00195
00196 if( STRING_HAS_SUFFIX(fname,".jpg") ){
00197 RETURN( mri_write_jpg(fname,im) ) ;
00198 }
00199
00200 if( strcmp(fname,"-") != 0 ){
00201 imfile = fopen( fname , "r" ) ;
00202 if( imfile != NULL ){
00203 fclose( imfile ) ;
00204 fprintf(stderr,"(FAILED) attempt to overwrite file %s\n",fname) ;
00205 RETURN( 0 );
00206 }
00207 }
00208
00209 if( strcmp(fname,"-") != 0 )
00210 imfile = fopen( fname , "w" ) ;
00211 else
00212 imfile = stdout ;
00213
00214 if( imfile == NULL ){
00215 fprintf( stderr , "couldn't open for output file %s\n" , fname ) ;
00216 RETURN( 0 );
00217 }
00218
00219 switch( im->kind ){
00220
00221 case MRI_byte:
00222 fprintf( imfile , "P5\n%d %d\n255\n" , im->nx,im->ny ) ;
00223 fwrite( MRI_BYTE_PTR(im), sizeof(byte), im->nvox, imfile ) ;
00224 break ;
00225
00226 case MRI_rgb:
00227 fprintf( imfile , "P6\n%d %d\n255\n" , im->nx,im->ny ) ;
00228 fwrite( MRI_RGB_PTR(im), sizeof(byte), 3*im->nvox, imfile ) ;
00229 break ;
00230
00231 }
00232
00233 if( imfile != stdout ) fclose( imfile ) ;
00234 RETURN( 1 );
00235 }
00236
00237
00238
00239 int mri_write_1D( char *fname , MRI_IMAGE *im )
00240 {
00241 MRI_IMAGE *fim ;
00242 int jj ;
00243
00244 ENTRY("mri_write_1D") ;
00245
00246 if( fname == NULL || strlen(fname) == 0 ||
00247 im == NULL || im->nz > 1 ) RETURN( 0 );
00248
00249 fim = mri_transpose( im ) ;
00250 jj = mri_write_ascii( fname , fim ) ;
00251 mri_free(fim) ;
00252 RETURN( jj );
00253 }
00254
00255
00256
00257 int mri_write_ascii( char *fname, MRI_IMAGE *im )
00258 {
00259 int ii , jj , nx , ny ;
00260 FILE *imfile ;
00261
00262 ENTRY("mri_write_ascii") ;
00263
00264 if( fname == NULL || strlen(fname) == 0 ||
00265 im == NULL || im->nz > 1 ) RETURN( 0 );
00266
00267 if( strcmp(fname,"-") == 0 ){
00268 imfile = stdout ;
00269 } else {
00270 imfile = fopen( fname , "r" ) ;
00271 if( imfile != NULL ){
00272 fclose( imfile ) ;
00273 fprintf(stderr,"(FAILED) attempt to overwrite file %s\n",fname) ;
00274 RETURN( 0 );
00275 }
00276 imfile = fopen( fname , "w" ) ;
00277 if( imfile == NULL ){
00278 fprintf( stderr , "couldn't open for output file %s\n" , fname ) ;
00279 RETURN( 0 );
00280 }
00281 }
00282
00283 nx = im->nx ; ny = im->ny ;
00284
00285 for( jj=0 ; jj < ny ; jj++ ){
00286
00287 switch( im->kind ){
00288
00289 case MRI_float:{
00290 float *iar = MRI_FLOAT_PTR(im) + (jj*nx) ;
00291 for( ii=0 ; ii < nx ; ii++ )
00292 fprintf(imfile," %14.7g",iar[ii]) ;
00293 }
00294 break ;
00295
00296 case MRI_short:{
00297 short *iar = MRI_SHORT_PTR(im) + (jj*nx) ;
00298 for( ii=0 ; ii < nx ; ii++ )
00299 fprintf(imfile," %6d",iar[ii]) ;
00300 }
00301 break ;
00302
00303 case MRI_byte:{
00304 byte *iar = MRI_BYTE_PTR(im) + (jj*nx) ;
00305 for( ii=0 ; ii < nx ; ii++ )
00306 fprintf(imfile," %3d",iar[ii]) ;
00307 }
00308 break ;
00309
00310 case MRI_int:{
00311 int *iar = MRI_INT_PTR(im) + (jj*nx) ;
00312 for( ii=0 ; ii < nx ; ii++ )
00313 fprintf(imfile," %6d",iar[ii]) ;
00314 }
00315 break ;
00316
00317 case MRI_double:{
00318 double *iar = MRI_DOUBLE_PTR(im) + (jj*nx) ;
00319 for( ii=0 ; ii < nx ; ii++ )
00320 fprintf(imfile," %14.7g",iar[ii]) ;
00321 }
00322 break ;
00323
00324 case MRI_complex:{
00325 complex *iar = MRI_COMPLEX_PTR(im) + (jj*nx) ;
00326 for( ii=0 ; ii < nx ; ii++ )
00327 fprintf(imfile," %14.7g %14.7g",iar[ii].r,iar[ii].i) ;
00328 }
00329 break ;
00330
00331 case MRI_rgb:{
00332 byte *iar = MRI_RGB_PTR(im) + (3*jj*nx) ;
00333 for( ii=0 ; ii < nx ; ii++ )
00334 fprintf(imfile," %3d %3d %3d",iar[3*ii],iar[3*ii+1],iar[3*ii+2]) ;
00335 }
00336 break ;
00337 }
00338
00339 fprintf(imfile,"\n") ;
00340 }
00341
00342 if( imfile != stdout ) fclose(imfile) ;
00343 RETURN( 1 );
00344 }
00345
00346
00347
00348
00349
00350 int mri_write_raw( char *fname , MRI_IMAGE *im )
00351 {
00352 FILE *imfile ;
00353 void *data ;
00354 int dsize ;
00355
00356 ENTRY("mri_write_raw") ;
00357
00358 if( im == NULL || fname == NULL || fname[0] == '\0' ) RETURN( 0 );
00359
00360 dsize = im->pixel_size * im->nvox ;
00361 data = mri_data_pointer( im ) ;
00362
00363 if( dsize <= 0 || data == NULL ) RETURN( 0 );
00364
00365 imfile = fopen( fname , "w" ) ;
00366
00367 if( imfile == NULL ){
00368 fprintf(stderr,"** Can't open for output: %s\n",fname) ; RETURN( 0 );
00369 }
00370
00371 fwrite( data , 1 , dsize , imfile ) ;
00372 fclose( imfile ) ;
00373 RETURN( 1 );
00374 }
00375
00376
00377
00378 #include <signal.h>
00379
00380 int mri_write_jpg( char *fname , MRI_IMAGE *im )
00381 {
00382 char *pg , *jpfilt ;
00383 FILE *fp ;
00384
00385 if( fname == NULL || *fname == '\0' || im == NULL ) return 0 ;
00386 if( im->kind != MRI_rgb && im->kind != MRI_byte ) return 0 ;
00387
00388 pg = THD_find_executable( "cjpeg" ) ;
00389 if( pg == NULL ) return 0 ;
00390
00391 jpfilt = (char *)malloc( sizeof(char)*(strlen(pg)+strlen(fname)+32) ) ;
00392 sprintf( jpfilt , "%s -quality 95 > %s" , pg , fname ) ;
00393 #ifndef CYGWIN
00394 signal( SIGPIPE , SIG_IGN ) ;
00395 #endif
00396 fp = popen( jpfilt , "w" ) ;
00397 if( fp == NULL ){ free((void *)jpfilt); return 0 ;}
00398
00399 if( im->kind == MRI_rgb ){
00400 fprintf(fp,"P6\n%d %d\n255\n" , im->nx,im->ny ) ;
00401 fwrite( MRI_RGB_PTR(im), sizeof(byte), 3*im->nvox, fp ) ;
00402 } else if( im->kind == MRI_byte ){
00403 fprintf(fp,"P5\n%d %d\n255\n" , im->nx,im->ny ) ;
00404 fwrite( MRI_BYTE_PTR(im), sizeof(byte), im->nvox, fp ) ;
00405 }
00406 (void) pclose(fp) ;
00407 free((void *)jpfilt) ; return 1 ;
00408 }