/*****************************************************************************
Major portions of this software are copyrighted by the Medical College
of Wisconsin, 1994-2000, and are released under the Gnu General Public
License, Version 2. See the file README.Copyright for details.
******************************************************************************/
#include "mrilib.h"
int main( int argc , char * argv[] )
{
char prefix[255]="obi-wan-kenobi" , fname[255] ;
int datum = -1 ;
int iarg = 1 ;
int gnim , nx , ny , nz , kz ;
char ** gname ;
MRI_IMARR * arr ;
MRI_IMAGE * im , * qim ;
FILE * fp ;
/***** help? *****/
if( argc < 2 || strcmp(argv[1],"-help") == 0 ){
printf(
"Usage: imstack [options] image_filenames ...\n"
"Stacks up a set of 2D images into one big file (a la MGH).\n"
"Options:\n"
" -datum type Converts the output data file to be 'type',\n"
" which is either 'short' or 'float'.\n"
" The default type is the type of the first image.\n"
" -prefix name Names the output files to be 'name'.b'type' and 'name'.hdr.\n"
" The default name is 'obi-wan-kenobi'.\n"
) ;
exit(0) ;
}
machdep() ;
/***** scan for option *****/
while( iarg < argc && argv[iarg][0] == '-' ){
/*** -datum ***/
if( strcmp(argv[iarg],"-datum") == 0 ){
if( ++iarg >= argc ){
fprintf(stderr,"-datum needs a type!\n") ; exit(1) ;
}
if( strcmp(argv[iarg],"short") == 0 ){
datum = MRI_short ;
} else if( strcmp(argv[iarg],"float") == 0 ){
datum = MRI_float ;
} else {
fprintf(stderr,"-datum %s is illegal!\n",argv[iarg]) ; exit(1) ;
}
iarg++ ; continue ;
}
/*** -prefix ***/
if( strcmp(argv[iarg],"-prefix") == 0 ){
if( ++iarg >= argc ){
fprintf(stderr,"-prefix needs a name!\n") ; exit(1) ;
}
strcpy(prefix,argv[iarg]) ;
iarg++ ; continue ;
}
/*** ERROR ***/
fprintf(stderr,"Unrecognized option: %s\n",argv[iarg]) ; exit(1) ;
}
/***** Check if any filenames left *****/
if( iarg >= argc ){
fprintf(stderr,"No input image filenames?!\n") ; exit(1) ;
}
/***** Perform filename expansion on the input list *****/
MCW_warn_expand(1) ;
MCW_file_expand( argc - iarg , argv + iarg , &gnim , &gname ) ;
MCW_warn_expand(0) ;
if( gnim < 1 ){
fprintf(stderr,"Filename expansion fails on input filenames?!\n") ; exit(1) ;
}
/***** Read all files *****/
arr = mri_read_many_files( gnim , gname ) ;
if( arr == NULL || IMARR_COUNT(arr) <= 0 ){
fprintf(stderr,"Can't read input files?!\n") ; exit(1) ;
}
MCW_free_expand( gnim , gname ) ;
fprintf(stderr,"Read in %d 2D slices\n",IMARR_COUNT(arr)) ;
/***** Set output datum, if not already fixed *****/
if( datum < 0 ){
datum = IMARR_SUBIMAGE(arr,0)->kind ;
if( datum != MRI_short && datum != MRI_float ){
fprintf(stderr,"Input image type is %s -- you must use -datum!\n",
MRI_TYPE_name[datum]) ;
exit(1) ;
}
}
/***** Check images for equal sizes *****/
nx = IMARR_SUBIMAGE(arr,0)->nx ;
ny = IMARR_SUBIMAGE(arr,0)->ny ;
nz = IMARR_COUNT(arr) ;
for( kz=1 ; kz < nz ; kz++ ){
if( IMARR_SUBIMAGE(arr,kz)->nx != nx ||
IMARR_SUBIMAGE(arr,kz)->ny != ny ){
fprintf(stderr,"All images must be the same size (%d x %d)\n",nx,ny) ;
exit(1) ;
}
}
/***** Write the output brick *****/
sprintf(fname,"%s.b%s",prefix,MRI_TYPE_name[datum]) ;
fp = fopen( fname , "w" ) ;
if( fp == NULL ){
fprintf(stderr,"Can't open output file %s\n",fname) ; exit(1) ;
}
for( kz=0 ; kz < nz ; kz++ ){
im = IMARR_SUBIMAGE(arr,kz) ;
if( im->kind != datum ) qim = mri_to_mri( datum , im ) ;
else qim = im ;
fwrite( mri_data_pointer(qim) , qim->pixel_size , qim->nx * qim->ny , fp ) ;
if( qim != im ) mri_free(qim) ;
mri_free(im);
}
fclose( fp ) ;
fprintf(stderr,"Wrote output brick %s\n",fname) ;
/***** Write the output header *****/
sprintf(fname,"%s.hdr",prefix) ;
fp = fopen( fname , "w" ) ;
if( fp == NULL ){
fprintf(stderr,"Can't open output file %s\n",fname) ; exit(1) ;
}
fprintf( fp , "%d %d %d 0\n" , nx,ny,nz ) ;
fclose(fp) ;
fprintf(stderr,"Wrote output header %s: %d %d %d\n",fname,nx,ny,nz) ;
exit(0) ;
}
syntax highlighted by Code2HTML, v. 0.9.1