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_write.c File Reference

#include "mrilib.h"
#include <signal.h>

Go to the source code of this file.


Defines

#define HEADER   (28*256)

Functions

int mri_write (char *fname, MRI_IMAGE *im)
int mri_write_7D (char *fname, MRI_IMAGE *im)
int mri_write_pnm (char *fname, MRI_IMAGE *im)
int mri_write_1D (char *fname, MRI_IMAGE *im)
int mri_write_ascii (char *fname, MRI_IMAGE *im)
int mri_write_raw (char *fname, MRI_IMAGE *im)
int mri_write_jpg (char *fname, MRI_IMAGE *im)

Define Documentation

#define HEADER   (28*256)
 


Function Documentation

int mri_write char *    fname,
MRI_IMAGE   im
 

Definition at line 15 of file mri_write.c.

References ENTRY, free, MRI_IMAGE::kind, malloc, mri_data_pointer(), MRI_IS_2D, mri_write_7D(), mri_write_pnm(), MRI_IMAGE::nx, MRI_IMAGE::ny, MRI_IMAGE::pixel_size, and RETURN.

Referenced by AB_interp(), get_line_opt(), ISQ_saver_CB(), main(), SFIM_write_avs(), and write_images().

00016 {
00017    FILE  *imfile ;
00018    void  *data ;
00019    int   dsize , noheader = FALSE ;
00020 
00021 ENTRY("mri_write") ;
00022 
00023    /* bad inputs? */
00024 
00025    if( im == NULL || fname == NULL || *fname == '\0' ) RETURN(0) ;
00026 
00027    /* special cases */
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    /* open the file for output */
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 ;   /* 18 Apr 2005: write to stdout instead */
00048 
00049    if( imfile == NULL ){
00050      fprintf( stderr , "couldn't open for output file %s\n" , fname ) ;
00051      RETURN(0) ;
00052    }
00053 
00054    /*** possibly write MRI header, unless a standard image type ***/
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:    /* raw 64x64 short */
00063          case 32768:   /* raw 128x128 short */
00064          case 131072:  /* raw 256x256 short */
00065          case 524288:  /* raw 512x512 short -- RWC 3/21/95 */
00066          case 2097152: /* raw 1024x1024 short -- RWC 3/21/95 */
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:    /* raw 64x64 byte -- RWC 3/21/95 */
00075          case 16384:   /* raw 128x128 byte -- RWC 3/21/95 */
00076          case 65536:   /* raw 256x256 8-bit -- Matthew Belmonte March 1995 */
00077          case 262144:  /* raw 512x512 byte -- RWC 3/21/95 */
00078          case 1048576: /* raw 1024x1024 byte -- RWC 3/21/95 */
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    /*** special case: add Signa 4.x header (of all zeros) ***/
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) ;  /* header 256 x 256 */
00094       for( ii=0 ; ii < HEADER ; ii++ ) qq[ii] = 0 ;
00095       fwrite( qq , sizeof(short) , HEADER , imfile ) ;
00096       free(qq) ;
00097    }
00098 
00099    /*** write rest of data now ***/
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 }

int mri_write_1D char *    fname,
MRI_IMAGE   im
 

Definition at line 239 of file mri_write.c.

References ENTRY, fim, mri_free(), mri_transpose(), mri_write_ascii(), MRI_IMAGE::nz, and RETURN.

Referenced by GRA_handle_keypress(), GRA_refwrite_choose_CB(), main(), MASKAVE_main(), and process_1ddata().

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 }

int mri_write_7D char *    fname,
MRI_IMAGE   im
 

Definition at line 110 of file mri_write.c.

References ENTRY, MRI_IMAGE::kind, mri_data_pointer(), MRI_DIMENSIONALITY, MRI_IMAGE::nt, MRI_IMAGE::nu, MRI_IMAGE::nv, MRI_IMAGE::nvox, MRI_IMAGE::nw, MRI_IMAGE::nx, MRI_IMAGE::ny, MRI_IMAGE::nz, MRI_IMAGE::pixel_size, and RETURN.

Referenced by mri_write().

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    /*** write MR7 header ***/
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    /*** write rest of data now ***/
00174 
00175    data = mri_data_pointer( im ) ;
00176    fwrite( data , im->pixel_size , im->nvox , imfile ) ;
00177    fclose( imfile ) ;
00178 
00179    RETURN( 1 );
00180 }

int mri_write_ascii char *    fname,
MRI_IMAGE   im
 

------------------------ Only good for 1D and 2D images ---------------------------*

Definition at line 257 of file mri_write.c.

References ENTRY, i, MRI_IMAGE::kind, MRI_BYTE_PTR, MRI_COMPLEX_PTR, MRI_DOUBLE_PTR, MRI_FLOAT_PTR, MRI_INT_PTR, MRI_RGB_PTR, MRI_SHORT_PTR, MRI_IMAGE::nx, MRI_IMAGE::ny, MRI_IMAGE::nz, r, and RETURN.

Referenced by GRA_refwrite_choose_CB(), main(), and mri_write_1D().

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 }

int mri_write_jpg char *    fname,
MRI_IMAGE   im
 

Definition at line 380 of file mri_write.c.

References free, MRI_IMAGE::kind, malloc, MRI_BYTE_PTR, MRI_RGB_PTR, MRI_IMAGE::nvox, MRI_IMAGE::nx, MRI_IMAGE::ny, pclose, popen, and THD_find_executable().

Referenced by mri_write_pnm().

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 }

int mri_write_pnm char *    fname,
MRI_IMAGE   im
 

Definition at line 184 of file mri_write.c.

References ENTRY, MRI_IMAGE::kind, MRI_BYTE_PTR, MRI_RGB_PTR, mri_write_jpg(), MRI_IMAGE::nvox, MRI_IMAGE::nx, MRI_IMAGE::ny, MRI_IMAGE::nz, RETURN, and STRING_HAS_SUFFIX.

Referenced by AFNI_finalize_saveim_CB(), GRA_file_pixmap(), ISQ_saver_CB(), ISQ_snapfile(), main(), mri_write(), RCREND_finalize_saveim_CB(), and REND_finalize_saveim_CB().

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") ){   /* 15 Apr 2005 */
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 ;     /* 18 Apr 2005: write to 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 ) ;     /* header */
00223        fwrite( MRI_BYTE_PTR(im), sizeof(byte), im->nvox, imfile ) ; /* bytes */
00224      break ;
00225 
00226      case MRI_rgb:
00227        fprintf( imfile , "P6\n%d %d\n255\n" , im->nx,im->ny ) ;      /* header */
00228        fwrite( MRI_RGB_PTR(im), sizeof(byte), 3*im->nvox, imfile ) ; /* bytes */
00229      break ;
00230 
00231    }
00232 
00233    if( imfile != stdout ) fclose( imfile ) ;
00234    RETURN( 1 );
00235 }

int mri_write_raw char *    fname,
MRI_IMAGE   im
 

Definition at line 350 of file mri_write.c.

References ENTRY, mri_data_pointer(), MRI_IMAGE::nvox, MRI_IMAGE::pixel_size, and RETURN.

Referenced by main().

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 }
 

Powered by Plone

This site conforms to the following standards: