Doxygen Source Code Documentation
mri_read.c File Reference
#include <stdio.h>#include <ctype.h>#include <string.h>#include <sys/stat.h>#include "mrilib.h"#include "ge4_header.h"#include "mayo_analyze.h"#include "siemens_vision.h"Go to the source code of this file.
Data Structures | |
| struct | MCW_imsize |
Defines | |
| #define | SEEK_END 2 |
| #define | SEEK_SET 0 |
| #define | MAX_MCW_IMSIZE 99 |
| #define | SKIPCOM {if(ch == '#') do{ch = getc(imfile) ;}while(ch != '\n' && ch != EOF);} |
| #define | NUMSCAN(var) |
| #define | LBUF 2524288 |
| #define | FRB(b) do{ if( (b)!=NULL ){free((b)); (b)=NULL;} }while(0) |
| #define | INC_TSARSIZE 128 |
| #define | MATRIX_MAX 9 |
| #define | MATRIX_MAX 16 |
Functions | |
| short | check_dicom_magic_num (char *) |
| MRI_IMAGE * | mri_try_mri (FILE *, int *) |
| MRI_IMAGE * | mri_try_7D (FILE *, int *) |
| MRI_IMAGE * | mri_try_pgm (FILE *, int *) |
| void | swap_4 (void *ppp) |
| void | swap_8 (void *ppp) |
| void | swap_2 (void *ppp) |
| MRI_IMAGE * | mri_read (char *fname) |
| MRI_IMAGE * | mri_read_ge4 (char *filename) |
| MRI_IMARR * | mri_read_3D (char *tname) |
| MRI_IMARR * | mri_read_file (char *fname) |
| MRI_IMAGE * | mri_read_just_one (char *fname) |
| int | mri_imcount_analyze75 (char *) |
| int | mri_imcount_siemens (char *) |
| int | mri_imcount (char *tname) |
| MRI_IMARR * | mri_read_many_files (int nf, char *fn[]) |
| MRI_IMARR * | mri_read_ppm3 (char *fname) |
| MRI_IMAGE * | mri_read_nsize (char *fname) |
| MRI_IMARR * | mri_read_many_nsize (int nf, char *fn[]) |
| void | init_MCW_sizes (void) |
| char * | my_strdup (char *str) |
| char * | imsized_fname (char *fname) |
| long | mri_filesize (char *pathname) |
| void | mri_read_ppm_header (char *fname, int *nx, int *ny) |
| MRI_IMAGE * | mri_read_ppm (char *fname) |
| char * | my_fgets (char *buf, int size, FILE *fts) |
| floatvec * | decode_linebuf (char *buf) |
| MRI_IMAGE * | mri_read_ascii (char *fname) |
| MRI_IMAGE * | mri_read_1D (char *fname) |
| MRI_IMAGE * | mri_read_ascii_ragged (char *fname, float filler) |
| void | read_ascii_floats (char *fname, int *nff, float **ff) |
| MRI_IMARR * | mri_read_3A (char *tname) |
| void | swap_analyze_hdr (struct dsr *pntr) |
| MRI_IMARR * | mri_read_analyze75 (char *hname) |
| MRI_IMARR * | mri_read3D_analyze75 (char *hname) |
| MRI_IMARR * | mri_read_siemens (char *hname) |
| void | mri_purge_delay (MRI_IMAGE *im) |
| void | mri_input_delay (MRI_IMAGE *im) |
| MRI_IMARR * | mri_read_file_delay (char *fname) |
| MRI_IMARR * | mri_read_3D_delay (char *tname) |
Variables | |
| char | MRILIB_orients [8] = "\0\0\0\0\0\0\0\0" |
| float | MRILIB_zoff = 0.0 |
| float | MRILIB_tr = 0.0 |
| float | MRILIB_xoff = 0.0 |
| float | MRILIB_yoff = 0.0 |
| int | use_MRILIB_xoff = 0 |
| int | use_MRILIB_yoff = 0 |
| int | use_MRILIB_zoff = 0 |
| int | use_MRILIB_xcos = 0 |
| float | MRILIB_xcos [3] = { 1.0 , 0.0 , 0.0 } |
| int | use_MRILIB_ycos = 0 |
| float | MRILIB_ycos [3] = { 0.0 , 1.0 , 0.0 } |
| int | use_MRILIB_zcos = 0 |
| float | MRILIB_zcos [3] = { 0.0 , 0.0 , 1.0 } |
| int | use_MRILIB_slicespacing = 0 |
| float | MRILIB_slicespacing = 0.0 |
| MCW_imsize | imsize [MAX_MCW_IMSIZE] |
| int | MCW_imsize_good = -1 |
| float | lbfill = 0.0 |
Detailed Description
This file contains all the functions for reading image files. It is primarily used by to3d.c. It reads 2D images (into MRI_IMAGE struct) and arrays of 2D images (into MRI_IMARR struct).
Definition in file mri_read.c.
Define Documentation
|
|
Free a buffer and set it to NULL Definition at line 1779 of file mri_read.c. Referenced by mri_read_ascii(), and mri_read_ascii_ragged(). |
|
|
Increment for time series array size for mri_read_ascii() Definition at line 1942 of file mri_read.c. Referenced by mri_read_ascii(), and read_ascii_floats(). |
|
|
Length of line buffer for mri_read_ascii() Definition at line 1776 of file mri_read.c. Referenced by mri_read_ascii(), mri_read_ascii_ragged(), my_fgets(), and read_ascii_floats(). |
|
|
|
|
|
|
|
|
Max number of preset file sizes to allow. Definition at line 122 of file mri_read.c. Referenced by imsized_fname(), and init_MCW_sizes(). |
|
|
Value: { SKIPCOM ; \
while( ch!=EOF && !isdigit(ch) ){ch = getc(imfile); SKIPCOM; } \
for( nch=0 ; isdigit(ch) ; nch++,ch=getc(imfile) ) {buf[nch] = ch ;} \
buf[nch]='\0'; \
var = strtol( buf , NULL , 10 ) ; }Definition at line 670 of file mri_read.c. Referenced by mri_read_ppm(), mri_read_ppm3(), mri_read_ppm_header(), mri_read_stuff(), mri_try_7D(), mri_try_mri(), mri_try_pgm(), and TTget_ppm(). |
|
|
Definition at line 21 of file mri_read.c. Referenced by mri_read(), mri_read_3D(), and mri_read_3D_delay(). |
|
|
Definition at line 25 of file mri_read.c. Referenced by check_dicom_magic_num(), mri_imcount_siemens(), mri_input_delay(), mri_read(), mri_read3D_analyze75(), mri_read_3D(), mri_read_analyze75(), mri_read_siemens(), mri_try_7D(), mri_try_mri(), and mri_try_pgm(). |
|
|
Skip comments in a PPM file. Definition at line 665 of file mri_read.c. |
Function Documentation
|
|
Check for dicom magic number (string) in file Bytes 128-131 should be "DICM" in a Dicom Part 10 file Definition at line 3117 of file mri_read.c. References SEEK_SET. Referenced by mri_read_file().
03118 {
03119 FILE * fp;
03120 char test_string[5] ;
03121
03122 fp = fopen( fname, "rb" ) ;
03123 if(fp == NULL ) return 0 ;
03124 fseek( fp, 128 , SEEK_SET ) ;
03125 fread( test_string , 1 , 4 , fp ) ; test_string[4] = '\0' ;
03126 fclose( fp ) ;
03127 if( strcmp(test_string,"DICM") == 0 ) {
03128 return 1 ;
03129 } else {
03130 return 0 ;
03131 }
03132 }
|
|
|
Decode a line buffer into an array of floats. Definition at line 1890 of file mri_read.c. References floatvec::ar, KILL_floatvec, lbfill, malloc, floatvec::nar, ncol, and realloc. Referenced by mri_read_ascii(), and mri_read_ascii_ragged().
01891 {
01892 floatvec *fv=NULL ;
01893 int blen, bpos, ncol, ii, count ;
01894 char sep, vbuf[64] , *cpt ;
01895 float val ;
01896
01897 if( buf == NULL || *buf == '\0' ) return fv ;
01898
01899 blen = strlen(buf) ;
01900 ncol = 0 ;
01901
01902 /* convert commas to blanks */
01903
01904 for( ii=0 ; ii < blen ; ii++ ) if( buf[ii] == ',' ) buf[ii] = ' ' ;
01905
01906 fv = (floatvec *)malloc(sizeof(floatvec)) ;
01907 fv->nar = 0 ;
01908 fv->ar = (float *)NULL ;
01909
01910 for( bpos=0 ; bpos < blen ; ){
01911 /* skip to next nonblank character */
01912
01913 for( ; bpos < blen && (isspace(buf[bpos])||buf[bpos]==',') ; bpos++ ) ; /* nada */
01914 if( bpos == blen ) break ; /* end of line */
01915
01916 sscanf( buf+bpos , "%63s" , vbuf ) ;
01917
01918 val = 0.0 ; count = 1 ;
01919 if( vbuf[0] == '*' ){ /* 10 Aug 2004 */
01920 val = lbfill ;
01921 } else if( (cpt=strchr(vbuf,'@')) != NULL ){
01922 sscanf( vbuf , "%d%c%f" , &count , &sep , &val ) ;
01923 if( count < 1 ) count = 1 ;
01924 if( *(cpt+1) == '*' ) val = lbfill ; /* 10 Aug 2004 */
01925 } else {
01926 sscanf( vbuf , "%f" , &val ) ;
01927 }
01928
01929 fv->ar = (float *)realloc( (void *)fv->ar , sizeof(float)*(fv->nar+count) ) ;
01930 for( ii=0 ; ii < count ; ii++ ) fv->ar[ii+fv->nar] = val ;
01931 fv->nar += count ;
01932 bpos += strlen(vbuf) ;
01933 }
01934
01935 if( fv->nar == 0 ){ KILL_floatvec(fv); fv = NULL; }
01936 return fv ;
01937 }
|
|
|
Check if a filesize fits an MCW_IMSIZE setup.
Definition at line 1597 of file mri_read.c. References EXIT, MCW_imsize::head, init_MCW_sizes(), malloc, MAX_MCW_IMSIZE, MCW_imsize_good, mri_filesize(), my_strdup(), and MCW_imsize::size. Referenced by mri_imcount(), mri_read_file(), mri_read_file_delay(), and mri_read_just_one().
01598 {
01599 int num , lll ;
01600 long len ;
01601 char * new_name ;
01602
01603 init_MCW_sizes() ;
01604 if( MCW_imsize_good == 0 ){
01605 new_name = my_strdup(fname) ; /* nothing to fit */
01606 return new_name ; /* --> return copy of old name */
01607 }
01608
01609 len = mri_filesize( fname ) ;
01610 if( len <= 0 ){
01611 new_name = my_strdup(fname) ; /* not an existing filename */
01612 return new_name ; /* --> return copy of old name */
01613 }
01614
01615 for( num=0 ; num < MAX_MCW_IMSIZE ; num++ ){ /* check each possibility */
01616
01617 if( imsize[num].size <= 0 ) continue ; /* skip to next one */
01618
01619 if( imsize[num].head < 0 && len == imsize[num].size ){ /* fixed size fit */
01620
01621 lll = strlen(fname) + strlen(imsize[num].prefix) + 4 ;
01622 new_name = (char *) malloc( sizeof(char) * lll ) ;
01623 if( new_name == NULL ){
01624 fprintf(stderr,"\n*** Can't malloc in imsized_fname! ***\a\n");
01625 EXIT(1) ;
01626 }
01627 sprintf( new_name , "%s%s" , imsize[num].prefix , fname ) ;
01628 return new_name ;
01629
01630 } else if( (len-imsize[num].head) % imsize[num].size == 0 ){
01631 int count = (len-imsize[num].head) / imsize[num].size ;
01632
01633 if( count < 1 ) continue ; /* skip to next one */
01634
01635 lll = strlen(fname) + strlen(imsize[num].prefix) + 32 ;
01636 new_name = (char *) malloc( sizeof(char) * lll ) ;
01637 if( new_name == NULL ){
01638 fprintf(stderr,"\n*** Can't malloc in imsized_fname! ***\a\n");
01639 EXIT(1) ;
01640 }
01641 sprintf( new_name , "%s%d:%s" , imsize[num].prefix , count , fname ) ;
01642 return new_name ;
01643 }
01644
01645 }
01646
01647 new_name = my_strdup(fname) ; /* no fit --> return copy of old name */
01648 return new_name ;
01649 }
|
|
|
Set up MCW_SIZE_# database for input. This implements the facility for the user to define MCW_IMSIZE_1 (or AFNI_IMSIZE_1) et cetera, for pre-defining a relationship between a file size in bytes and a 3D: prefix. This function is only called once to setup the table.
Definition at line 1514 of file mri_read.c. References EXIT, free, MCW_imsize::head, malloc, MAX_MCW_IMSIZE, MCW_imsize_good, my_getenv(), MCW_imsize::prefix, and MCW_imsize::size. Referenced by imsized_fname().
01515 {
01516 int num , count ;
01517 char ename[32] ;
01518 char * str ;
01519
01520 if( MCW_imsize_good >= 0 ) return ;
01521
01522 MCW_imsize_good = 0 ;
01523
01524 for( num=0 ; num < MAX_MCW_IMSIZE ; num++ ){ /* look for environment string */
01525
01526 imsize[num].size = -1 ;
01527
01528 /* try to find environment variable with the num-th name */
01529
01530 sprintf( ename , "AFNI_IMSIZE_%d" , num+1 ) ;
01531 str = my_getenv( ename ) ;
01532
01533 if( str == NULL ){
01534 sprintf( ename , "MCW_IMSIZE_%d" , num+1 ) ;
01535 str = my_getenv( ename ) ;
01536 if( str == NULL ) continue ;
01537 }
01538
01539 imsize[num].prefix = (char *) malloc( sizeof(char) * strlen(str) ) ;
01540 if( imsize[num].prefix == NULL ){
01541 fprintf(stderr,"\n*** Can't malloc in init_MCW_sizes! ***\a\n");
01542 EXIT(1) ;
01543 }
01544
01545 if( str[0] != '%' ){ /* e.g., 16096=3D:-1:0:64:64:1: */
01546
01547 imsize[num].head = -1 ;
01548 count = sscanf( str , "%d=%s" , &(imsize[num].size) , imsize[num].prefix ) ;
01549 if( count != 2 || imsize[num].size < 2 || strlen(imsize[num].prefix) < 2 ){
01550 free( imsize[num].prefix ) ;
01551 fprintf(stderr,"bad environment %s = %s\n" ,
01552 ename , str ) ;
01553 }
01554
01555 } else { /* e.g., %16096+0=3D:0:7904:64:64: */
01556
01557 count = sscanf( str+1 , "%d+%d=%s" ,
01558 &(imsize[num].size) , &(imsize[num].head) , imsize[num].prefix ) ;
01559
01560 if( count != 3 || imsize[num].size < 2 ||
01561 imsize[num].head < 0 || strlen(imsize[num].prefix) < 2 ){
01562
01563 free( imsize[num].prefix ) ;
01564 fprintf(stderr,"bad environment %s = %s\n" ,
01565 ename , str ) ;
01566 }
01567 }
01568
01569 MCW_imsize_good ++ ;
01570 }
01571
01572 return ;
01573 }
|
|
|
Return the size of a file in bytes.
Definition at line 1659 of file mri_read.c. Referenced by imsized_fname(), main(), mri_imcount_mpeg(), and mri_read_mpeg().
01660 {
01661 static struct stat buf ;
01662 int ii ;
01663
01664 if( pathname == NULL ) return -1 ;
01665 ii = stat( pathname , &buf ) ; if( ii != 0 ) return -1 ;
01666 return buf.st_size ;
01667 }
|
|
|
Definition at line 1198 of file mri_read.c. References ENTRY, free, imsized_fname(), mri_dicom_seterr(), mri_imcount_analyze75(), mri_imcount_dicom(), mri_imcount_mpeg(), mri_imcount_siemens(), nz, and RETURN. Referenced by AFNI_read_images(), and T3D_read_images().
01199 {
01200 int hglobal , himage , nx , ny , nz , ngood ;
01201 char fname[256]="\0" ;
01202 char * new_fname ;
01203
01204 ENTRY("mri_imcount") ;
01205
01206 if( tname == NULL ) RETURN( 0 );
01207 new_fname = imsized_fname( tname ) ;
01208 if( new_fname == NULL ) RETURN( 0 );
01209
01210 /*** a 3D filename ***/
01211
01212 if( strlen(new_fname) > 9 && new_fname[0] == '3' && new_fname[1] == 'D' &&
01213 (new_fname[2] == ':' || new_fname[3] == ':') ){
01214 /* check for ':', too 3 Jan 2005 [rickr] */
01215 switch( new_fname[2] ){
01216
01217 default:
01218 case ':':
01219 ngood = sscanf( new_fname , "3D:%d:%d:%d:%d:%d:%s" ,
01220 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
01221 break ;
01222
01223 case 's':
01224 ngood = sscanf( new_fname , "3Ds:%d:%d:%d:%d:%d:%s" ,
01225 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
01226 break ;
01227
01228 case 'b':
01229 ngood = sscanf( new_fname , "3Db:%d:%d:%d:%d:%d:%s" ,
01230 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
01231 break ;
01232
01233 case 'f':
01234 ngood = sscanf( new_fname , "3Df:%d:%d:%d:%d:%d:%s" ,
01235 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
01236 break ;
01237
01238 case 'd': /* 06 Feb 2003 */
01239 ngood = sscanf( new_fname , "3Dd:%d:%d:%d:%d:%d:%s" ,
01240 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
01241 break ;
01242
01243 case 'i':
01244 ngood = sscanf( new_fname , "3Di:%d:%d:%d:%d:%d:%s" ,
01245 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
01246 break ;
01247
01248 case 'c':
01249 ngood = sscanf( new_fname , "3Dc:%d:%d:%d:%d:%d:%s" ,
01250 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
01251 break ;
01252
01253 case 'r':
01254 ngood = sscanf( new_fname , "3Dr:%d:%d:%d:%d:%d:%s" ,
01255 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
01256 break ;
01257 }
01258
01259 free( new_fname ) ;
01260 if( ngood < 6 || himage < 0 ||
01261 nx <= 0 || ny <= 0 || nz <= 0 ||
01262 strlen(fname) <= 0 ) RETURN( 0 );
01263 else RETURN( nz );
01264 }
01265
01266 /*** a 3A filename ***/
01267
01268 if( strlen(new_fname) > 9 &&
01269 new_fname[0] == '3' && new_fname[1] == 'A' && new_fname[3] == ':' ){
01270
01271 switch( new_fname[2] ){
01272
01273 default: ngood = 0 ; break ;
01274
01275 case 's':
01276 ngood = sscanf( new_fname, "3As:%d:%d:%d:%s", &nx, &ny, &nz, fname ) ;
01277 break ;
01278
01279 case 'b':
01280 ngood = sscanf( new_fname, "3Ab:%d:%d:%d:%s", &nx, &ny, &nz, fname ) ;
01281 break ;
01282
01283 case 'f':
01284 ngood = sscanf( new_fname, "3Af:%d:%d:%d:%s", &nx, &ny, &nz, fname ) ;
01285 break ;
01286 }
01287
01288 free( new_fname ) ;
01289 if( ngood < 4 || nx <= 0 || ny <= 0 || nz <= 0 || strlen(fname) <= 0 ) RETURN( 0 );
01290 else RETURN( nz );
01291 }
01292
01293 /*** 05 Feb 2001: deal with ANALYZE .hdr files ***/
01294
01295 if( strstr(new_fname,".hdr") != NULL ||
01296 strstr(new_fname,".HDR") != NULL ){
01297
01298 nz = mri_imcount_analyze75( new_fname ) ;
01299 if( nz > 0 ){ free(new_fname); RETURN(nz); }
01300 }
01301
01302 if( strstr(new_fname,".ima") != NULL ||
01303 strstr(new_fname,".IMA") != NULL ){ /* 12 Mar 2001 */
01304
01305 nz = mri_imcount_siemens( new_fname ) ;
01306 if( nz > 0 ){ free(new_fname); RETURN(nz); }
01307 }
01308
01309 if( strstr(new_fname,".mpg" ) != NULL || /* 03 Dec 2003 */
01310 strstr(new_fname,".MPG" ) != NULL ||
01311 strstr(new_fname,".mpeg") != NULL ||
01312 strstr(new_fname,".MPEG") != NULL ){
01313
01314 nz = mri_imcount_mpeg( new_fname ) ;
01315 if( nz > 0 ){ free(new_fname); RETURN(nz); }
01316 }
01317
01318 /*** 19 Jul 2002: see if it is a DICOM file ***/
01319
01320 mri_dicom_seterr(0) ;
01321 nz = mri_imcount_dicom( new_fname ) ; /* cf. mri_read_dicom.c */
01322 mri_dicom_seterr(1) ;
01323 if( nz > 0 ){ free(new_fname); RETURN(nz); }
01324
01325 /*** not recognized ***/
01326
01327 free(new_fname) ; RETURN(1) ; /* assume it has 1 image in it, somewhere */
01328 }
|
|
|
Count how many 2D slices are in an ANALYZE file.
Definition at line 2467 of file mri_read.c. References image_dimension::dim, dsr::dime, ENTRY, nz, RETURN, and swap_analyze_hdr(). Referenced by mri_imcount().
02468 {
02469 FILE * fp ;
02470 struct dsr hdr ; /* ANALYZE .hdr format */
02471 int doswap , nz ;
02472
02473 ENTRY("mri_imcount_analyze75") ;
02474
02475 fp = fopen( hname , "rb" ) ;
02476 if( fp == NULL ) RETURN(0) ;
02477 hdr.dime.dim[0] = 0 ;
02478 fread( &hdr , 1 , sizeof(struct dsr) , fp ) ;
02479 fclose(fp) ;
02480 if( hdr.dime.dim[0] == 0 ) RETURN(0) ;
02481 doswap = (hdr.dime.dim[0] < 0 || hdr.dime.dim[0] > 15) ;
02482 if( doswap ) swap_analyze_hdr( &hdr ) ;
02483
02484 switch( hdr.dime.dim[0] ){
02485 case 2: nz = 1 ; break ;
02486 case 3: nz = hdr.dime.dim[3] ; break ;
02487
02488 default:
02489 case 4: nz = hdr.dime.dim[3] * hdr.dime.dim[4] ; break ;
02490 }
02491 if( nz < 1 ) nz = 1 ;
02492
02493 RETURN(nz) ;
02494 }
|
|
|
Count the number of 2D images in a Siemens Vision .ima file. Unfortunately, this requires reading the image data and checking for all-zero images. This is because Siemens stores their data in a fixed size file, and so just fills out the empty space with blank images if need be. Definition at line 2872 of file mri_read.c. References calloc, Siemens_vision_header::DisplayMatrixSize, free, i, SEEK_SET, SIEMENS_HEADERSIZE, Siemens_vision_header::SiemensStudyDateMM, swap, and swap_4(). Referenced by mri_imcount().
02873 {
02874 struct Siemens_vision_header head ;
02875 FILE * fp ;
02876 int i,j,xx,yy , matrix , swap , imagesize,nxx,blank , slices ;
02877 struct stat file_stat ;
02878 short *imar ;
02879
02880 /*--- check file size ---*/
02881
02882 if( hname == NULL ) return 0 ;
02883
02884 i = stat( hname , &file_stat ) ;
02885 if( i < 0 ) return 0 ;
02886
02887 /*--- read header data ---*/
02888
02889 fp = fopen( hname , "rb" ) ;
02890 if( fp == NULL ) return 0 ;
02891 fread( &head , sizeof(struct Siemens_vision_header) , 1 , fp ) ;
02892
02893 /*-- check some integer in header to determine if we need to byteswap --*/
02894
02895 swap = ( head.SiemensStudyDateMM < 0 || head.SiemensStudyDateMM > 13 ) ;
02896 if( swap ){
02897 swap_4( &(head.SiemensStudyDateMM) ) ;
02898 if( head.SiemensStudyDateMM < 0 || head.SiemensStudyDateMM > 13 ){
02899 swap = 0 ;
02900 }
02901 }
02902
02903 /*-- find image size from header --*/
02904
02905 if( swap ) swap_4( &(head.DisplayMatrixSize) ) ;
02906 imagesize = head.DisplayMatrixSize ;
02907
02908 /*-- determine number of sub-images in file --*/
02909
02910 #undef MATRIX_MAX
02911 #define MATRIX_MAX 9
02912
02913 i = 2*imagesize*imagesize ;
02914 for( matrix=1 ; matrix < MATRIX_MAX ; matrix++ )
02915 if( file_stat.st_size == i*matrix*matrix + SIEMENS_HEADERSIZE ) break ;
02916
02917 if( matrix == MATRIX_MAX ){
02918 fclose(fp) ; return 0 ; /* didn't recognize file format */
02919 }
02920 #undef MATRIX_MAX
02921
02922 /*-- read image data from file (but don't byteswap it) --*/
02923
02924 imar = (short *) calloc(sizeof(short),matrix*matrix*imagesize*imagesize) ;
02925 fseek( fp , SIEMENS_HEADERSIZE , SEEK_SET ) ;
02926 fread( imar , sizeof(short) , matrix*matrix*imagesize*imagesize , fp ) ;
02927 fclose(fp) ;
02928
02929 /*-- count slices - all zero (blank) slices at end are skipped --*/
02930
02931 slices = 0 ; nxx = matrix*imagesize ;
02932
02933 for( yy=0 ; yy < matrix ; yy++ ){ /* rows in array of sub-images */
02934 for( xx=0 ; xx < matrix ; xx++ ){ /* cols in array of sub-images */
02935 blank = 1 ;
02936 for( j=0 ; j < imagesize ; j++ ){ /* row in sub-image */
02937 for( i=0 ; i < imagesize ; i++ ){ /* col in sub-image */
02938 if( imar[i+xx*imagesize+(j+yy*imagesize)*nxx] ) blank = 0 ;
02939 }
02940 }
02941 if( !blank ) slices = 1 + xx + yy*matrix ;
02942 }
02943 }
02944
02945 free(imar) ; return slices ;
02946 }
|
|
|
mark as set for delay input * Definition at line 3165 of file mri_read.c. References MRI_IMAGE::fname, MRI_IMAGE::foffset, MRI_IMAGE::fondisk, malloc, mri_fix_data_pointer(), mri_swapbytes(), MRI_IMAGE::nvox, MRI_IMAGE::pixel_size, SEEK_SET, and MRI_IMAGE::was_swapped. Referenced by mri_data_pointer().
03166 {
03167 FILE * imfile=NULL ;
03168 void * imar ;
03169
03170 /** if no delay input file,
03171 or is marked as already read in, do nothing **/
03172
03173 if( im->fname == NULL ||
03174 (im->fondisk & INPUT_DELAY) == 0 ) return ;
03175
03176 /** open the delay input file [06 Mar 2001: maybe not] **/
03177
03178 if( strcmp(im->fname,"ALLZERO") != 0 ){
03179 imfile = fopen( im->fname , "r" ) ;
03180 if( imfile == NULL ){
03181 fprintf( stderr , "couldn't open delayed image file %s\n" , im->fname ) ;
03182 return ;
03183 }
03184 }
03185
03186 /** make space for the array **/
03187
03188 imar = (void *) malloc( im->nvox * im->pixel_size ) ;
03189 if( imar == NULL ){
03190 fprintf( stderr ,
03191 "malloc fails for delayed image from file %s\n" , im->fname ) ;
03192 if( imfile != NULL ) fclose( imfile ) ;
03193 return ;
03194 }
03195 mri_fix_data_pointer( imar , im ) ;
03196
03197 /** read from the file into the array **/
03198
03199 if( imfile != NULL ){
03200 fseek( imfile , im->foffset , SEEK_SET ) ;
03201 fread( imar , im->pixel_size , im->nvox , imfile ) ;
03202 fclose( imfile ) ;
03203 } else {
03204 memset( imar , 0 , im->nvox * im->pixel_size ) ; /* 06 Mar 2001 */
03205 }
03206
03207 /** swap bytes, if so marked **/
03208
03209 if( (im->fondisk & BSWAP_DELAY) ){
03210 mri_swapbytes( im ) ;
03211 im->was_swapped = 1 ; /* 07 Mar 2002 */
03212 }
03213
03214 /** mark as already read from disk **/
03215
03216 im->fondisk ^= INPUT_DELAY ;
03217
03218 #if 0
03219 fprintf(stderr,"delayed input from file %s at offset %d\n",im->fname,im->foffset);
03220 #endif
03221 return ;
03222 }
|
|
|
Definition at line 3142 of file mri_read.c. References MRI_IMAGE::fname, MRI_IMAGE::fondisk, free, mri_clear_data_pointer, and mri_data_pointer().
03143 {
03144 void * ar ;
03145
03146 /** if no delay filename,
03147 or if it is marked as already set for delay input, do nothing **/
03148
03149 if( im->fname == NULL ||
03150 (im->fondisk & INPUT_DELAY) != 0 ) return ;
03151
03152 /** get the data pointer, throw data way, clear the data pointer **/
03153
03154 ar = mri_data_pointer( im ) ;
03155 if( ar != NULL ){ free(ar) ; mri_clear_data_pointer(im) ; }
03156
03157 /** mark as set for delay input **/
03158
03159 im->fondisk |= INPUT_DELAY ;
03160 return ;
03161 }
|
|
|
Earliest image reading function in the AFNI package. Reads a single 2D image.
Definition at line 188 of file mri_read.c. References abs, MRI_IMAGE::dt, MRI_IMAGE::dw, MRI_IMAGE::dx, MRI_IMAGE::dy, MRI_IMAGE::dz, ENTRY, L, mri_add_name(), mri_data_pointer(), mri_free(), mri_new(), mri_read_ascii(), mri_read_ppm(), mri_read_stuff(), mri_try_7D(), mri_try_mri(), mri_try_pgm(), MRILIB_orients, MRILIB_slicespacing, MRILIB_tr, MRILIB_xoff, MRILIB_yoff, MRILIB_zoff, MRI_IMAGE::nvox, MRI_IMAGE::pixel_size, RETURN, SEEK_END, SEEK_SET, skip, swap, swap_4(), swap_fourbytes(), swap_twobytes(), use_MRILIB_slicespacing, use_MRILIB_xoff, use_MRILIB_yoff, use_MRILIB_zoff, MRI_IMAGE::was_swapped, and MRI_IMAGE::zo. Referenced by main(), mri_read_file(), mri_read_file_delay(), PH_loadim(), and UC_read_opts().
00189 {
00190 FILE *imfile ;
00191 MRI_IMAGE *im ;
00192 int length , skip=0 , swap=0 ;
00193 void *data ;
00194
00195 ENTRY("mri_read") ;
00196
00197 if( fname == NULL || *fname == '\0' ) RETURN(NULL) ; /* bad user */
00198
00199 /**-- 27 Apr 2005: check here for special filenames --**/
00200
00201 if( strstr(fname,".jpg" ) != NULL || /* various formats */
00202 strstr(fname,".JPG" ) != NULL || /* that we convert */
00203 strstr(fname,".jpeg") != NULL || /* to PPG/PGM using */
00204 strstr(fname,".JPEG") != NULL || /* external filters */
00205 strstr(fname,".gif" ) != NULL ||
00206 strstr(fname,".GIF" ) != NULL ||
00207 strstr(fname,".tif" ) != NULL ||
00208 strstr(fname,".TIF" ) != NULL ||
00209 strstr(fname,".tiff") != NULL ||
00210 strstr(fname,".TIFF") != NULL ||
00211 strstr(fname,".bmp" ) != NULL ||
00212 strstr(fname,".BMP" ) != NULL ||
00213 strstr(fname,".pbm" ) != NULL ||
00214 strstr(fname,".PBM" ) != NULL ||
00215 strstr(fname,".pgm" ) != NULL ||
00216 strstr(fname,".PGM" ) != NULL ||
00217 strstr(fname,".ppm" ) != NULL ||
00218 strstr(fname,".PPM" ) != NULL ||
00219 strstr(fname,".png" ) != NULL ||
00220 strstr(fname,".PNG" ) != NULL ){
00221
00222 im = mri_read_stuff(fname) ; if( im != NULL ) RETURN(im) ;
00223 }
00224
00225 /*-- check if file exists and is readable --*/
00226
00227 imfile = fopen( fname , "r" ) ;
00228 if( imfile == NULL ){
00229 fprintf( stderr , "couldn't open image file %s\n" , fname ) ;
00230 RETURN( NULL );
00231 }
00232
00233 fseek( imfile , 0L , SEEK_END ) ; /* get the length of the file */
00234 length = ftell( imfile ) ; /* (the AJ way) */
00235
00236 /*--- 03 Dec 2001: check for GEMS format file "IMGF" ---*/
00237 /*[[[ Information herein from Medical Image Format FAQ ]]]*/
00238
00239 { char str[5]="AFNI" ;
00240 int nx , ny , bpp , cflag , hdroff , extraskip=0 ;
00241 rewind(imfile) ; fread(str,1,4,imfile) ; /* check for "IMGF" or "GEMS" */
00242
00243 if( str[0]=='G' && str[1]=='E' && str[2]=='M' && str[3]=='S' ){ /* 12 Feb 2004 */
00244 char buf[4096]; int bb,cc; /* search for IMGF in 1st 4K */
00245 rewind(imfile); cc=fread(buf,1,4096,imfile); cc-=4 ;
00246 for( bb=4; bb < cc ; bb++ )
00247 if( buf[bb]=='I' && buf[bb+1]=='M' && buf[bb+2]=='G' && buf[bb+3]=='F' ) break ;
00248 if( bb < cc ){
00249 fseek( imfile , (long)bb , SEEK_SET ) ; extraskip = bb ;
00250 fread(str,1,4,imfile) ;
00251 }
00252 }
00253
00254 /* 12 Feb 2004: modified to allow for starting at extraskip */
00255
00256 if( str[0]=='I' && str[1]=='M' && str[2]=='G' && str[3]=='F' ){
00257
00258 fread( &skip , 4,1, imfile ) ; /* read next 5 ints */
00259 fread( &nx , 4,1, imfile ) ;
00260 fread( &ny , 4,1, imfile ) ;
00261 fread( &bpp , 4,1, imfile ) ;
00262 fread( &cflag, 4,1, imfile ) ;
00263
00264 if( nx < 0 || nx > 8192 ){ /* maybe have to byte swap 5 ints */
00265 swap = 1 ; /* flag that we are swapping data */
00266 swap_4(&skip); swap_4(&nx) ;
00267 swap_4(&ny) ; swap_4(&bpp); swap_4(&cflag);
00268 }
00269 skip += extraskip ; /* location of image data in file */
00270 if( nx < 0 || nx > 8192 || ny < 0 || ny > 8192 ) goto The_Old_Way ;
00271 if( skip < 0 || skip >= length ) goto The_Old_Way ;
00272 if( bpp != 16 || cflag != 1 ) goto The_Old_Way ;
00273
00274 /* make image space */
00275
00276 im = mri_new( nx , ny , MRI_short ) ;
00277
00278 /* try to read image auxiliary data as well (not mandatory) */
00279
00280 length = fseek( imfile , 148L+extraskip , SEEK_SET ) ; /* magic GEMS offset */
00281 if( length == 0 ){
00282 fread( &hdroff , 4,1 , imfile ) ; /* location of image header */
00283 if( swap ) swap_4(&hdroff) ;
00284 if( hdroff > 0 ){ /* read from image header */
00285 float dx,dy,dz, dxx,dyy,dzz, xyz[9], zz ; int itr, ii,jj,kk, qq ;
00286 static int nzoff=0 ;
00287 static float zoff ;
00288
00289 /* get voxel grid sizes */
00290
00291 fseek( imfile , hdroff+26+extraskip , SEEK_SET ) ;
00292 fread( &dzz , 4,1 , imfile ) ;
00293
00294 fseek( imfile , hdroff+50+extraskip , SEEK_SET ) ;
00295 fread( &dxx , 4,1 , imfile ) ;
00296 fread( &dyy , 4,1 , imfile ) ;
00297
00298 if( swap ){ swap_4(&dxx); swap_4(&dyy); swap_4(&dzz); }
00299
00300 /* save into image header [dw > 0 is signal that dx,dy,dz are OK] */
00301
00302 if( dxx > 0.01 && dyy > 0.01 && dzz > 0.01 ){
00303 im->dx = dxx; im->dy = dyy; im->dz = dzz; im->dw = 1.0;
00304 }
00305
00306 /* grid orientation: from 3 sets of LPI corner coordinates: */
00307 /* xyz[0..2] = top left hand corner of image (TLHC) */
00308 /* xyz[3..5] = top right hand corner of image (TRHC) */
00309 /* xyz[6..8] = bottom right hand corner of image (BRHC) */
00310 /* GEMS coordinate orientation here is LPI. */
00311 /* Orientation is saved into global string MRILIB_orients. */
00312 /* N.B.: AFNI coordinates are RAI orientation. */
00313
00314 fseek( imfile , hdroff+154+extraskip , SEEK_SET ) ;
00315 fread( xyz , 4,9 , imfile ) ;
00316 if( swap ) swap_fourbytes(9,xyz) ;
00317
00318 /* x-axis orientation */
00319 /* ii determines which spatial direction is x-axis */
00320 /* and is the direction that has the biggest change */
00321 /* between the TLHC and TRHC */
00322
00323 dx = fabs(xyz[3]-xyz[0]) ; ii = 1 ;
00324 dy = fabs(xyz[4]-xyz[1]) ; if( dy > dx ){ ii=2; dx=dy; }
00325 dz = fabs(xyz[5]-xyz[2]) ; if( dz > dx ){ ii=3; }
00326 dx = xyz[ii+2]-xyz[ii-1] ; if( dx < 0. ){ ii = -ii; }
00327 switch( ii ){
00328 case 1: MRILIB_orients[0] = 'L'; MRILIB_orients[1] = 'R'; break;
00329 case -1: MRILIB_orients[0] = 'R'; MRILIB_orients[1] = 'L'; break;
00330 case 2: MRILIB_orients[0] = 'P'; MRILIB_orients[1] = 'A'; break;
00331 case -2: MRILIB_orients[0] = 'A'; MRILIB_orients[1] = 'P'; break;
00332 case 3: MRILIB_orients[0] = 'I'; MRILIB_orients[1] = 'S'; break;
00333 case -3: MRILIB_orients[0] = 'S'; MRILIB_orients[1] = 'I'; break;
00334 default: MRILIB_orients[0] ='\0'; MRILIB_orients[1] ='\0'; break;
00335 }
00336
00337 /* y-axis orientation */
00338 /* jj determines which spatial direction is y-axis */
00339 /* and is the direction that has the biggest change */
00340 /* between the BRHC and TRHC */
00341
00342 dx = fabs(xyz[6]-xyz[3]) ; jj = 1 ;
00343 dy = fabs(xyz[7]-xyz[4]) ; if( dy > dx ){ jj=2; dx=dy; }
00344 dz = fabs(xyz[8]-xyz[5]) ; if( dz > dx ){ jj=3; }
00345 dx = xyz[jj+5]-xyz[jj+2] ; if( dx < 0. ){ jj = -jj; }
00346 switch( jj ){
00347 case 1: MRILIB_orients[2] = 'L'; MRILIB_orients[3] = 'R'; break;
00348 case -1: MRILIB_orients[2] = 'R'; MRILIB_orients[3] = 'L'; break;
00349 case 2: MRILIB_orients[2] = 'P'; MRILIB_orients[3] = 'A'; break;
00350 case -2: MRILIB_orients[2] = 'A'; MRILIB_orients[3] = 'P'; break;
00351 case 3: MRILIB_orients[2] = 'I'; MRILIB_orients[3] = 'S'; break;
00352 case -3: MRILIB_orients[2] = 'S'; MRILIB_orients[3] = 'I'; break;
00353 default: MRILIB_orients[2] ='\0'; MRILIB_orients[3] ='\0'; break;
00354 }
00355
00356 MRILIB_orients[6] = '\0' ; /* terminate orientation string */
00357
00358 kk = 6 - abs(ii)-abs(jj) ; /* which spatial direction is z-axis */
00359 /* where 1=L-R, 2=P-A, 3=I-S */
00360 zz = xyz[kk-1] ; /* z-coordinate of this slice (from TLHC) */
00361
00362 im->zo = zz ; /* 07 Aug 2002: save slice offset */
00363
00364 /* getting orientation of z-axis requires 2 images in a row -*/
00365
00366 if( nzoff == 0 ){ /* from 1st GEMS image */
00367
00368 zoff = zz ; /* save this for 2nd image calculation */
00369 switch( kk ){ /* may be changed on second image */
00370 case 1: MRILIB_orients[4] = 'L'; MRILIB_orients[5] = 'R'; break;
00371 case 2: MRILIB_orients[4] = 'P'; MRILIB_orients[5] = 'A'; break;
00372 case 3: MRILIB_orients[4] = 'I'; MRILIB_orients[5] = 'S'; break;
00373 default: MRILIB_orients[4] ='\0'; MRILIB_orients[5] ='\0'; break;
00374 }
00375
00376 } else if( nzoff == 1 ){ /* from 2nd GEMS image */
00377
00378 float qoff = zz - zoff ; /* vive la difference */
00379 if( qoff < 0 ) kk = -kk ; /* kk determines z-axis orientation */
00380
00381 if( !use_MRILIB_slicespacing && qoff != 0.0 ){ /* 10 Jan 2004 */
00382 use_MRILIB_slicespacing = 1 ;
00383 MRILIB_slicespacing = fabs(qoff) ;
00384 }
00385
00386 switch( kk ){
00387 case 1: MRILIB_orients[4] = 'L'; MRILIB_orients[5] = 'R'; break;
00388 case -1: MRILIB_orients[4] = 'R'; MRILIB_orients[5] = 'L'; break;
00389 case 2: MRILIB_orients[4] = 'P'; MRILIB_orients[5] = 'A'; break;
00390 case -2: MRILIB_orients[4] = 'A'; MRILIB_orients[5] = 'P'; break;
00391 case 3: MRILIB_orients[4] = 'I'; MRILIB_orients[5] = 'S'; break;
00392 case -3: MRILIB_orients[4] = 'S'; MRILIB_orients[5] = 'I'; break;
00393 default: MRILIB_orients[4] ='\0'; MRILIB_orients[5] ='\0'; break;
00394 }
00395
00396 /* save spatial offset of first slice */
00397 /* [this needs to be positive in the direction of] */
00398 /* [the -z axis, so may need to change its sign ] */
00399
00400 MRILIB_zoff = zoff ; use_MRILIB_zoff = 1 ;
00401 if( kk == 1 || kk == 2 || kk == 3 ) MRILIB_zoff = -MRILIB_zoff ;
00402
00403 /* Same for x offset; [20 Dec 2001]
00404 This must be at the middle of the TLHC voxel,
00405 so we must move a little bit towards the TRHC edge;
00406 We only use the result if the x-coordinate doesn't
00407 change significantly between the TRHC and BRHC,
00408 to avoid problems with oblique slices. */
00409
00410 qq = abs(ii) ;
00411 MRILIB_xoff = ( xyz[qq-1]*(nx-0.5) + xyz[qq+2]*0.5 ) / nx ;
00412 if( ii == 1 || ii == 2 || ii == 3 ) MRILIB_xoff = -MRILIB_xoff ;
00413 use_MRILIB_xoff = ( fabs(xyz[qq+2]-xyz[qq+5]) < 0.01*dxx ) ;
00414
00415 /* Same for y offset;
00416 This must be at the middle of the TLHC voxel,
00417 so we must move a little bit towards the BRHC edge;
00418 We only use the result if the y-coordinate doesn't
00419 change significantly between the TLHC and TRHC. */
00420
00421 qq = abs(jj) ;
00422 MRILIB_yoff = ( xyz[qq-1]*(ny-0.5) + xyz[qq+5]*0.5 ) / ny ;
00423 if( jj == 1 || jj == 2 || jj == 3 ) MRILIB_yoff = -MRILIB_yoff ;
00424 use_MRILIB_yoff = ( fabs(xyz[qq-1]-xyz[qq+2]) < 0.01*dyy ) ;
00425 }
00426 nzoff++ ; /* 3rd and later images don't count for z-orientation */
00427
00428 /* get TR, save into global variable */
00429
00430 if( MRILIB_tr <= 0.0 ){
00431 fseek( imfile , hdroff+194+extraskip , SEEK_SET ) ;
00432 fread( &itr , 4,1 , imfile ) ;
00433 if( swap ) swap_4(&itr) ;
00434 MRILIB_tr = im->dt = 1.0e-6 * itr ;
00435 }
00436 }
00437 } /* end of trying to read image header */
00438
00439 goto Ready_To_Roll ; /* skip to the reading place */
00440 }
00441 } /* end of GEMS */
00442
00443 /*--- OK, do it the old way ---*/
00444
00445 The_Old_Way:
00446
00447 #if 0
00448 MRILIB_orients[0] = '\0' ; MRILIB_zoff = MRILIB_tr = 0.0 ; /* 03 Dec 2001 */
00449 #endif
00450
00451 switch( length ){
00452
00453 case 512: /* raw 16x16 short -- RWCox: 06 Dec 2001 */
00454 im = mri_new( 16 , 16 , MRI_short ) ;
00455 break ;
00456
00457 case 2048: /* raw 32x32 short -- RWCox: 19 Sep 2000 */
00458 im = mri_new( 32 , 32 , MRI_short ) ;
00459 break ;
00460
00461 case 4096: /* raw 64x64 byte -- RWC 3/21/95 */
00462 im = mri_new( 64 , 64 , MRI_byte ) ;
00463 break ;
00464
00465 case 8192: /* raw 64x64 short */
00466 case 16096: /* with Signa 5.x header */
00467 im = mri_new( 64 , 64 , MRI_short ) ;
00468 skip = length - 8192 ;
00469 break ;
00470
00471 #if 0
00472 case 18432: /* raw 96x96 short */
00473 im = mri_new( 96 , 96 , MRI_short ) ;
00474 break ;
00475 #endif
00476
00477 case 16384: /* raw 128x128 byte -- RWC 3/21/95 */
00478 im = mri_new( 128 , 128 , MRI_byte ) ;
00479 break ;
00480
00481 case 32768: /* raw 128x128 short */
00482 case 40672: /* with Signa 5.x header */
00483 im = mri_new( 128 , 128 , MRI_short ) ;
00484 skip = length - 32768 ;
00485 break ;
00486
00487 case 65536: /* raw 256x256 8-bit -- Matthew Belmonte March 1995 */
00488 im = mri_new( 256 , 256 , MRI_byte ) ;
00489 break ;
00490
00491 case 131072: /* raw 256x256 short */
00492 case 138976: /* Signa 5.x */
00493 case 145408: /* Signa 4.x */
00494
00495 im = mri_new( 256 , 256 , MRI_short ) ;
00496 skip = length - 131072 ;
00497 break ;
00498
00499 #if 0
00500 case 262144: /* raw 256x256 float */
00501 im = mri_new( 256 , 256 , MRI_float ) ;
00502 break ;
00503 #else
00504 case 262144: /* raw 512x512 byte -- RWC 3/21/95 */
00505 im = mri_new( 512 , 512 , MRI_byte ) ;
00506 break ;
00507
00508 case 524288: /* raw 512x512 short -- RWC 3/21/95 */
00509 im = mri_new( 512 , 512 , MRI_short ) ;
00510 break ;
00511
00512 case 1048576: /* raw 1024x1024 byte -- RWC 3/21/95 */
00513 im = mri_new( 1024 , 1024 , MRI_byte ) ;
00514 break ;
00515
00516 case 2097152: /* raw 1024x1024 short -- RWC 3/21/95 */
00517 im = mri_new( 1024 , 1024 , MRI_short ) ;
00518 break ;
00519 #endif
00520
00521 /** not a canonical length: try something else **/
00522
00523 default:
00524 im = mri_try_mri( imfile , &skip ) ; /* Cox format */
00525 if( im == NULL ) im = mri_try_7D ( imfile , &skip ) ; /* 7D format */
00526 if( im == NULL ) im = mri_try_pgm( imfile , &skip ) ; /* PGM format */
00527 if( im != NULL ) break ;
00528
00529 fclose( imfile ) ; /* close it, since we failed (so far) */
00530
00531 im = mri_read_ascii( fname ) ; /* list of ASCII numbers */
00532 if( im != NULL ) RETURN( im );
00533
00534 im = mri_read_ppm( fname ) ; /* 15 Apr 1999 */
00535 if( im != NULL ) RETURN( im );
00536
00537 im = mri_read_stuff( fname ) ; /* 22 Nov 2002 */
00538 if( im != NULL ) RETURN( im );
00539
00540 fprintf( stderr , "do not recognize image file %s\n" , fname );
00541 fprintf( stderr , "length seen as %d\n" , length ) ;
00542 RETURN( NULL );
00543 }
00544
00545 /*-- Actually read the data from disk --*/
00546
00547 Ready_To_Roll:
00548
00549 data = mri_data_pointer( im ) ;
00550
00551 length = fseek( imfile , skip , SEEK_SET ) ;
00552 if( length != 0 ){
00553 fprintf( stderr , "mri_read error in skipping in file %s\n" , fname ) ;
00554 mri_free( im ) ;
00555 RETURN( NULL );
00556 }
00557
00558 length = fread( data , im->pixel_size , im->nvox , imfile ) ;
00559 fclose( imfile ) ;
00560
00561 if( length != im->nvox ){
00562 mri_free( im ) ;
00563 fprintf( stderr , "couldn't read image data from file %s\n" , fname ) ;
00564 RETURN( NULL );
00565 }
00566
00567 mri_add_name( fname , im ) ;
00568
00569 /*-- 03 Dec 2001: maybe need to swap bytes --*/
00570
00571 if( swap ){
00572 switch( im->pixel_size ){
00573 default: break ;
00574 case 2: swap_twobytes ( im->nvox, data ) ; break ; /* short */
00575 case 4: swap_fourbytes( im->nvox, data ) ; break ; /* int, float */
00576 case 8: swap_fourbytes( 2*im->nvox, data ) ; break ; /* complex */
00577 }
00578
00579 im->was_swapped = 1 ; /* 07 Mar 2002 */
00580 }
00581
00582 RETURN( im );
00583 }
|
|
|
Read an ANALYZE file into an ARRAY of 3D images [26 Aug 2002].
Definition at line 2683 of file mri_read.c. References ADDTO_IMARR, AFNI_noenv(), AFNI_yesenv(), ANDT_COMPLEX, ANDT_FLOAT, ANDT_RGB, ANDT_SIGNED_INT, ANDT_SIGNED_SHORT, ANDT_string, ANDT_UNSIGNED_CHAR, image_dimension::datatype, image_dimension::dim, dsr::dime, dt, MRI_IMAGE::dt, MRI_IMAGE::dw, MRI_IMAGE::dx, MRI_IMAGE::dy, MRI_IMAGE::dz, ENTRY, image_dimension::funused1, dsr::hist, INIT_IMARR, mri_add_name(), mri_data_pointer(), mri_datum_size(), mri_free(), mri_new_vol(), mri_scale_inplace(), mri_to_float(), MRILIB_orients, nz, data_history::originator, image_dimension::pixdim, RETURN, SEEK_SET, swap, swap_2(), swap_analyze_hdr(), swap_fourbytes(), swap_twobytes(), THD_filesize(), thd_floatscan(), and MRI_IMAGE::was_swapped.
02684 {
02685 FILE * fp ;
02686 char iname[1024] , buf[1024] ;
02687 int ii , jj , doswap ;
02688 struct dsr hdr ; /* ANALYZE .hdr format */
02689 int ngood , length , kim , koff , datum_type , datum_len , swap ;
02690 int nx,ny,nz , hglobal=0 , himage=0 ;
02691 float dx,dy,dz ;
02692 MRI_IMARR * newar ;
02693 MRI_IMAGE * newim ;
02694 void * imar ;
02695 float fac=0.0 ; /* 27 Nov 2001 */
02696 int floatize ; /* 28 Nov 2001 */
02697 int spmorg=0 ; /* 28 Nov 2001 */
02698
02699 int nt , nxyz ; /* 26 Aug 2002 */
02700 float dt ;
02701
02702 ENTRY("mri_read3D_analyze75") ;
02703
02704 /* check & prepare filenames */
02705
02706 if( hname == NULL ) RETURN(NULL) ;
02707 jj = strlen(hname) ;
02708 if( jj < 5 ) RETURN(NULL) ;
02709 if( strcmp(hname+jj-3,"hdr") != 0 ) RETURN(NULL) ;
02710 strcpy(iname,hname) ; strcpy(iname+jj-3,"img") ;
02711
02712 /* read header file into struct */
02713
02714 fp = fopen( hname , "rb" ) ;
02715 if( fp == NULL ) RETURN(NULL) ;
02716 hdr.dime.dim[0] = 0 ;
02717 fread( &hdr , 1 , sizeof(struct dsr) , fp ) ;
02718 fclose(fp) ;
02719 if( hdr.dime.dim[0] == 0 ) RETURN(NULL) ;
02720
02721 /* check for swap-age */
02722
02723 doswap = (hdr.dime.dim[0] < 0 || hdr.dime.dim[0] > 15) ;
02724 if( doswap ) swap_analyze_hdr( &hdr ) ;
02725
02726 /* 28 Nov 2001: attempt to decode originator a la SPM */
02727
02728 { short xyzuv[5] , xx,yy,zz ;
02729 memcpy( xyzuv , hdr.hist.originator , 10 ) ;
02730 if( xyzuv[3] == 0 && xyzuv[4] == 0 ){
02731 xx = xyzuv[0] ; yy = xyzuv[1] ; zz = xyzuv[2] ;
02732 if( doswap ){ swap_2(&xx); swap_2(&yy); swap_2(&zz); }
02733 if( xx > 0 && xx < hdr.dime.dim[1] &&
02734 yy > 0 && yy < hdr.dime.dim[2] &&
02735 zz > 0 && zz < hdr.dime.dim[3] ) spmorg = 1 ;
02736 }
02737 }
02738 if( spmorg ) strcpy( MRILIB_orients , "LRPAIS" ) ;
02739
02740 /* 27 Nov 2001: get a scale factor for images */
02741
02742 if( !AFNI_noenv("AFNI_ANALYZE_SCALE") ){
02743 fac = hdr.dime.funused1 ;
02744 (void) thd_floatscan( 1 , &fac ) ;
02745 if( fac < 0.0 || fac == 1.0 ) fac = 0.0 ;
02746 }
02747
02748 floatize = (fac != 0.0 || AFNI_yesenv("AFNI_ANALYZE_FLOATIZE")) ; /* 28 Nov 2001 */
02749
02750 /* get data type into mrilib MRI_* form */
02751
02752 switch( hdr.dime.datatype ){
02753 default:
02754 fprintf(stderr,"*** %s: Unknown ANALYZE datatype=%d (%s)\n",
02755 hname,hdr.dime.datatype,ANDT_string(hdr.dime.datatype) ) ;
02756 RETURN(NULL) ;
02757
02758 case ANDT_UNSIGNED_CHAR: datum_type = MRI_byte ; break;
02759 case ANDT_SIGNED_SHORT: datum_type = MRI_short ; break;
02760 case ANDT_SIGNED_INT: datum_type = MRI_int ; break;
02761 case ANDT_FLOAT: datum_type = MRI_float ; floatize = 0; break;
02762 case ANDT_COMPLEX: datum_type = MRI_complex; floatize = 0; break;
02763 case ANDT_RGB: datum_type = MRI_rgb ; floatize = 0; break;
02764 }
02765
02766 datum_len = mri_datum_size(datum_type) ;
02767
02768 /* compute dimensions of images, and number of images */
02769
02770 nx = hdr.dime.dim[1] ;
02771 ny = hdr.dime.dim[2] ;
02772 if( nx < 2 || ny < 2 ) RETURN(NULL) ;
02773
02774 switch( hdr.dime.dim[0] ){
02775 case 2: nz = 1 ; nt = 1 ; ; break ;
02776 case 3: nz = hdr.dime.dim[3] ; nt = 1 ; ; break ;
02777
02778 default:
02779 case 4: nz = hdr.dime.dim[3] ; nt = hdr.dime.dim[4] ; break ;
02780 }
02781 if( nz < 1 ) nz = 1 ;
02782 if( nt < 1 ) nt = 1 ;
02783
02784 dx = hdr.dime.pixdim[1] ;
02785 dy = hdr.dime.pixdim[2] ;
02786 dz = hdr.dime.pixdim[3] ;
02787 dt = hdr.dime.pixdim[4] ; if( dt <= 0.0 ) dt = 1.0 ;
02788
02789 /* open .img file and read images from it */
02790
02791 length = THD_filesize(iname) ;
02792 if( length <= 0 ){
02793 fprintf(stderr,"*** Can't find ANALYZE file %s\n",iname) ;
02794 RETURN(NULL) ;
02795 }
02796
02797 fp = fopen( iname , "rb" ) ;
02798 if( fp == NULL ){
02799 fprintf(stderr,"*** Can't open ANALYZE file %s\n",iname) ;
02800 RETURN(NULL) ;
02801 }
02802
02803 ngood = datum_len*nx*ny*nz*nt ;
02804 if( length < ngood ){
02805 fprintf( stderr,
02806 "*** ANALYZE file %s is %d bytes long but must be at least %d bytes long\n"
02807 "*** for nx=%d ny=%d nz=%d nt=%d and voxel=%d bytes\n",
02808 iname,length,ngood,nx,ny,nz,nt,datum_len ) ;
02809 fclose(fp) ; RETURN(NULL) ;
02810 }
02811
02812 /*** read images from the file ***/
02813
02814 INIT_IMARR(newar) ;
02815
02816 for( kim=0 ; kim < nt ; kim++ ){
02817 koff = hglobal + (kim+1)*himage + datum_len*nxyz*kim ;
02818 fseek( fp , koff , SEEK_SET ) ;
02819
02820 newim = mri_new_vol( nx,ny,nz , datum_type ) ;
02821 imar = mri_data_pointer( newim ) ;
02822 length = fread( imar , datum_len , nxyz , fp ) ;
02823
02824 if( doswap ){
02825 switch( datum_len ){
02826 default: break ;
02827 case 2: swap_twobytes ( nxyz , imar ) ; break ; /* short */
02828 case 4: swap_fourbytes( nxyz , imar ) ; break ; /* int, float */
02829 case 8: swap_fourbytes( 2*nxyz , imar ) ; break ; /* complex */
02830 }
02831 newim->was_swapped = 1 ; /* 07 Mar 2002 */
02832 }
02833
02834 /* 28 Nov 2001: convert to floats? */
02835
02836 if( floatize ){
02837 MRI_IMAGE *qim = mri_to_float(newim) ;
02838 mri_free(newim) ; newim = qim ;
02839 }
02840
02841 if( nt == 1 ) mri_add_name( iname , newim ) ;
02842 else {
02843 sprintf( buf , "%s#%d" , iname,kim ) ;
02844 mri_add_name( buf , newim ) ;
02845 }
02846
02847 newim->dx = dx ; newim->dy = dy ; newim->dz = dz ; newim->dt = dt ; newim->dw = 1.0 ;
02848 ADDTO_IMARR(newar,newim) ;
02849
02850 /* 27 Nov 2001: scale image? */
02851
02852 if( fac != 0.0 ) mri_scale_inplace( fac , newim ) ;
02853 }
02854
02855 fclose(fp) ; RETURN(newar) ;
02856 }
|
|
|
Read an ASCII file as columns, transpose to rows, allow column selectors.
Definition at line 2079 of file mri_read.c. References ENTRY, far, free, MCW_get_intlist(), mri_1D_fromstring(), MRI_FLOAT_PTR, mri_free(), mri_new(), mri_read_ascii(), mri_transpose(), MRI_IMAGE::nx, MRI_IMAGE::ny, and RETURN. Referenced by AFNI_finalize_read_1D_CB(), conv_set_ref(), custom_filter(), DT_read_opts(), GRA_refread_choose_CB(), IJKAR_reader(), initialize_program(), main(), MAIN_workprocess(), matrix_file_read(), NL_main(), Process_Options(), read_nodes_file(), read_one_time_series(), read_sxyz_1D(), read_table(), read_time_series(), sdata_from_1D(), SUMA_Load1DDset(), SUMA_Load_Surface_Object_eng(), SUMA_OpenDrawnROI_1D(), SUMA_Read_Color_Map_1D(), SUMA_Read_IRGB_file(), SUMA_readFScurv(), SUMA_ReadSegDO(), SUMA_VEC_Read(), THD_fetch_1D(), THD_get_all_timeseries(), THD_load_1D(), THD_open_1D(), and TS_reader().
02080 {
02081 MRI_IMAGE *inim , *outim , *flim ;
02082 char dname[512] , *cpt , *dpt ;
02083 int ii,jj,nx,ny,nts , *ivlist , *ivl , *sslist ;
02084 float *far , *oar ;
02085
02086 ENTRY("mri_read_1D") ;
02087
02088 if( fname == NULL || fname[0] == '\0' || strlen(fname) > 511 ) RETURN(NULL) ;
02089
02090 if( strncmp(fname,"1D:",3) == 0 ){ /* 28 Apr 2003 */
02091 return mri_1D_fromstring( fname+3 ) ;
02092 }
02093
02094 /*-- split filename and subvector list --*/
02095
02096 cpt = strstr(fname,"[") ;
02097 dpt = strstr(fname,"{") ; /* 30 Apr 2003: subsampling list */
02098
02099 if( cpt == fname || dpt == fname ){ /* can't be at start of filename! */
02100 fprintf(stderr,"*** Illegal filename in mri_read_1D: %s\n",fname) ;
02101 RETURN(NULL) ;
02102 } else { /* got a subvector list */
02103 strcpy( dname , fname ) ;
02104 if( cpt != NULL ){ ii = cpt-fname; dname[ii] = '\0'; }
02105 if( dpt != NULL ){ ii = dpt-fname; dname[ii] = '\0'; }
02106 }
02107
02108 /*-- read file in --*/
02109
02110 inim = mri_read_ascii(dname) ;
02111 if( inim == NULL ) RETURN(NULL) ;
02112 flim = mri_transpose(inim) ; mri_free(inim) ;
02113
02114 /*-- get the subvector and subsampling lists, if any --*/
02115
02116 nx = flim->nx ; ny = flim->ny ;
02117
02118 ivlist = MCW_get_intlist( ny , cpt ) ; /* subvector list */
02119 sslist = MCW_get_intlist( nx , dpt ) ; /* subsampling list */
02120
02121 /* if have subvector list, extract those rows into a new image */
02122
02123 if( ivlist != NULL && ivlist[0] > 0 ){
02124 nts = ivlist[0] ; /* number of subvectors */
02125 ivl = ivlist + 1 ; /* start of array of subvectors */
02126
02127 for( ii=0 ; ii < nts ; ii++ ){ /* check them out */
02128 if( ivl[ii] < 0 || ivl[ii] >= ny ){
02129 fprintf(stderr,"*** Out-of-range subvector [list] in mri_read_1D: %s\n",fname) ;
02130 mri_free(flim) ; free(ivlist) ; RETURN(NULL) ;
02131 }
02132 }
02133
02134 outim = mri_new( nx , nts , MRI_float ) ; /* make output image */
02135 far = MRI_FLOAT_PTR( flim ) ;
02136 oar = MRI_FLOAT_PTR( outim ) ;
02137
02138 for( ii=0 ; ii < nts ; ii++ ) /* copy desired rows */
02139 memcpy( oar + ii*nx , far + ivl[ii]*nx , sizeof(float)*nx ) ;
02140
02141 mri_free(flim); free(ivlist); flim = outim; ny = nts;
02142 }
02143
02144 /* if have subsampling list, extract those columns into a new image */
02145
02146 if( sslist != NULL && sslist[0] > 0 ){
02147 nts = sslist[0] ; /* number of columns to get */
02148 ivl = sslist + 1 ; /* start of array of column indexes */
02149
02150 for( ii=0 ; ii < nts ; ii++ ){ /* check them out */
02151 if( ivl[ii] < 0 || ivl[ii] >= nx ){
02152 fprintf(stderr,"*** Out-of-range subsampling {list} in mri_read_1D: %s\n",fname) ;
02153 mri_free(flim) ; free(sslist) ; RETURN(NULL) ;
02154 }
02155 }
02156
02157 outim = mri_new( nts , ny , MRI_float ) ; /* make output image */
02158 far = MRI_FLOAT_PTR( flim ) ;
02159 oar = MRI_FLOAT_PTR( outim ) ;
02160
02161 for( ii=0 ; ii < nts ; ii++ ) /* copy desired columns */
02162 for( jj=0 ; jj < ny ; jj++ )
02163 oar[ii+jj*nts] = far[ivl[ii]+jj*nx] ;
02164
02165 mri_free(flim); free(sslist); flim = outim;
02166 }
02167
02168 RETURN(flim) ;
02169 }
|
|
|
read lines, convert to floats, store * Definition at line 2327 of file mri_read.c. References ADDTO_IMARR, ENTRY, free, INIT_IMARR, mri_add_name(), MRI_FLOAT_PTR, mri_free(), mri_new(), mri_to_byte_scl(), mri_to_short(), nz, read_ascii_floats(), realloc, and RETURN. Referenced by mri_read_file(), and mri_read_file_delay().
02328 {
02329 int nx , ny , nz , ii , nxyz,nxy , nff ;
02330 int ngood , length , kim , datum_type ;
02331 char fname[256]="\0" , buf[512] ;
02332 MRI_IMARR * newar ;
02333 MRI_IMAGE * newim , * flim ;
02334 float * ff ;
02335
02336 ENTRY("mri_read_3A") ;
02337
02338 /*** get info from 3A tname ***/
02339
02340 if( tname == NULL || strlen(tname) < 10 ) RETURN(NULL) ;
02341
02342 switch( tname[2] ){ /* allow for 3As:, 3Ab:, 3Af: */
02343
02344 default: ngood = 0 ; break ;
02345
02346 case 's':
02347 ngood = sscanf( tname, "3As:%d:%d:%d:%s", &nx, &ny, &nz, fname ) ;
02348 datum_type = MRI_short ;
02349 break ;
02350
02351 case 'b':
02352 ngood = sscanf( tname, "3Ab:%d:%d:%d:%s", &nx, &ny, &nz, fname ) ;
02353 datum_type = MRI_byte ;
02354 break ;
02355
02356 case 'f':
02357 ngood = sscanf( tname, "3Af:%d:%d:%d:%s", &nx, &ny, &nz, fname ) ;
02358 datum_type = MRI_float ;
02359 break ;
02360 }
02361
02362 if( ngood < 4 || nx <= 0 || ny <= 0 || nz <= 0 || strlen(fname) <= 0 ) RETURN(NULL) ;
02363
02364 /* read the input file */
02365
02366 read_ascii_floats( fname , &nff , &ff ) ;
02367
02368 if( nff <= 0 || ff == NULL ) RETURN(NULL) ;
02369
02370 nxy = nx*ny ; nxyz = nxy*nz ;
02371
02372 if( nff < nxyz ){
02373 fprintf(stderr,
02374 "\n** WARNING: %s is too short - padding with %d zeros\n",
02375 tname,nxyz-nff) ;
02376 ff = (float *) realloc( ff , sizeof(float) * nxyz ) ;
02377 for( ii=nff ; ii < nxyz ; ii++ ) ff[ii] = 0.0 ;
02378 nff = nxyz ;
02379 } else if( nff > nxyz ){
02380 fprintf(stderr,
02381 "\n** WARNING: %s is too long - truncating off last %d values\n",
02382 tname,nff-nxyz) ;
02383 }
02384
02385 /* put the input data into MRI_IMAGEs */
02386
02387 INIT_IMARR(newar) ;
02388
02389 for( kim=0 ; kim < nz ; kim++ ){
02390 flim = mri_new( nx,ny , MRI_float ) ;
02391 memcpy( MRI_FLOAT_PTR(flim) , ff+nxy*kim , sizeof(float)*nxy ) ;
02392 switch( datum_type ){
02393 case MRI_float: newim = flim ; break ;
02394 case MRI_short: newim = mri_to_short(1.0,flim) ; mri_free(flim) ; break ;
02395 case MRI_byte: newim = mri_to_byte_scl(1.0,0.0,flim) ; mri_free(flim) ; break ;
02396 }
02397
02398 if( nz == 1 ) mri_add_name( fname , newim ) ;
02399 else {
02400 sprintf( buf , "%s#%d" , fname,kim ) ;
02401 mri_add_name( buf , newim ) ;
02402 }
02403
02404 ADDTO_IMARR(newar,newim) ;
02405 }
02406
02407 free(ff) ; RETURN(newar) ;
02408 }
|
|
|
Read one or more 2D slices from a "3D:" formatted image file. Definition at line 817 of file mri_read.c. References ADDTO_IMARR, ENTRY, INIT_IMARR, L, mri_add_name(), mri_data_pointer(), mri_new(), mri_swapbytes(), MRI_IMAGE::nvox, nz, MRI_IMAGE::pixel_size, RETURN, SEEK_END, SEEK_SET, swap, and MRI_IMAGE::was_swapped. Referenced by mri_read_file().
00818 {
00819 int hglobal , himage , nx , ny , nz ;
00820 char fname[256] , buf[512] ;
00821 int ngood , length , kim , koff , datum_type , datum_len , swap ;
00822 MRI_IMARR * newar ;
00823 MRI_IMAGE * newim ;
00824 void * imar ;
00825 FILE * imfile ;
00826
00827 ENTRY("mri_read_3D") ;
00828
00829 /*** get info from 3D tname ***/
00830
00831 if( tname == NULL || strlen(tname) < 10 ) RETURN(NULL) ;
00832
00833 switch( tname[2] ){ /* allow for 3D: or 3Ds: or 3Db:, etc */
00834
00835 default:
00836 case ':':
00837 ngood = sscanf( tname , "3D:%d:%d:%d:%d:%d:%s" ,
00838 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
00839
00840 swap = 0 ;
00841 datum_type = MRI_short ;
00842 datum_len = sizeof(short) ; /* better be 2 */
00843 break ;
00844
00845 case 's':
00846 ngood = sscanf( tname , "3Ds:%d:%d:%d:%d:%d:%s" ,
00847 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
00848
00849 swap = 1 ;
00850 datum_type = MRI_short ;
00851 datum_len = sizeof(short) ; /* better be 2 */
00852 break ;
00853
00854 case 'b':
00855 ngood = sscanf( tname , "3Db:%d:%d:%d:%d:%d:%s" ,
00856 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
00857
00858 swap = 0 ;
00859 datum_type = MRI_byte ;
00860 datum_len = sizeof(byte) ; /* better be 1 */
00861 break ;
00862
00863 case 'f':
00864 ngood = sscanf( tname , "3Df:%d:%d:%d:%d:%d:%s" ,
00865 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
00866
00867 swap = 0 ;
00868 datum_type = MRI_float ;
00869 datum_len = sizeof(float) ; /* better be 4 */
00870 break ;
00871
00872 case 'd': /* 06 Feb 2003 */
00873 ngood = sscanf( tname , "3Dd:%d:%d:%d:%d:%d:%s" ,
00874 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
00875
00876 swap = 0 ;
00877 datum_type = MRI_double ;
00878 datum_len = sizeof(double) ; /* better be 8 */
00879 break ;
00880
00881 case 'i':
00882 ngood = sscanf( tname , "3Di:%d:%d:%d:%d:%d:%s" ,
00883 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
00884
00885 swap = 0 ;
00886 datum_type = MRI_int ;
00887 datum_len = sizeof(int) ; /* better be 4 */
00888 break ;
00889
00890 case 'c':
00891 ngood = sscanf( tname , "3Dc:%d:%d:%d:%d:%d:%s" ,
00892 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
00893
00894 swap = 0 ;
00895 datum_type = MRI_complex ;
00896 datum_len = sizeof(complex) ; /* better be 8 */
00897 break ;
00898
00899 case 'r':
00900 ngood = sscanf( tname , "3Dr:%d:%d:%d:%d:%d:%s" ,
00901 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
00902
00903 swap = 0 ;
00904 datum_type = MRI_rgb ;
00905 datum_len = 3*sizeof(byte) ; /* better be 3 */
00906 break ;
00907 }
00908
00909 if( ngood < 6 || himage < 0 ||
00910 nx <= 0 || ny <= 0 || nz <= 0 ||
00911 strlen(fname) <= 0 ) RETURN(NULL); /* bad info */
00912
00913 /*** 06 Mar 2001: special case of fname ***/
00914
00915 if( strcmp(fname,"ALLZERO") == 0 ){
00916 INIT_IMARR(newar) ;
00917 for( kim=0 ; kim < nz ; kim++ ){
00918 newim = mri_new( nx , ny , datum_type ) ;
00919 imar = mri_data_pointer( newim ) ;
00920 memset( imar , 0 , newim->nvox * newim->pixel_size ) ;
00921 sprintf( buf , "%s#%d" , fname,kim ) ;
00922 mri_add_name( buf , newim ) ;
00923 ADDTO_IMARR(newar,newim) ;
00924 }
00925 RETURN(newar);
00926 }
00927
00928 /*** open the input file and position it ***/
00929
00930 imfile = fopen( fname , "r" ) ;
00931 if( imfile == NULL ){
00932 fprintf( stderr , "couldn't open image file %s\n" , fname ) ;
00933 RETURN(NULL);
00934 }
00935
00936 fseek( imfile , 0L , SEEK_END ) ; /* get the length of the file */
00937 length = ftell( imfile ) ;
00938
00939 /** 13 Apr 1999: modified to allow actual hglobal < -1
00940 as long as hglobal+himage >= 0 **/
00941
00942 #if 0 /* the old code */
00943 if( hglobal < 0 ){
00944 hglobal = length - nz*(datum_len*nx*ny+himage) ;
00945 if( hglobal < 0 ) hglobal = 0 ;
00946 }
00947 #else /* 13 Apr 1999 */
00948 if( hglobal == -1 || hglobal+himage < 0 ){
00949 hglobal = length - nz*(datum_len*nx*ny+himage) ;
00950 if( hglobal < 0 ) hglobal = 0 ;
00951 }
00952 #endif
00953
00954 ngood = hglobal + nz*(datum_len*nx*ny+himage) ;
00955 if( length < ngood ){
00956 fprintf( stderr,
00957 "image file %s is %d bytes long but must be at least %d bytes long\n"
00958 "for hglobal=%d himage=%d nx=%d ny=%d nz=%d and voxel=%d bytes\n",
00959 fname,length,ngood,hglobal,himage,nx,ny,nz,datum_len ) ;
00960 fclose( imfile ) ;
00961 RETURN(NULL);
00962 }
00963
00964 /*** read images from the file ***/
00965
00966 INIT_IMARR(newar) ;
00967
00968 for( kim=0 ; kim < nz ; kim++ ){
00969 koff = hglobal + (kim+1)*himage + datum_len*nx*ny*kim ;
00970 fseek( imfile , koff , SEEK_SET ) ;
00971
00972 newim = mri_new( nx , ny , datum_type ) ;
00973 imar = mri_data_pointer( newim ) ;
00974 length = fread( imar , datum_len , nx * ny , imfile ) ;
00975 if( swap ){
00976 mri_swapbytes( newim ) ;
00977 newim->was_swapped = 1 ; /* 07 Mar 2002 */
00978 }
00979
00980 if( nz == 1 ) mri_add_name( fname , newim ) ;
00981 else {
00982 sprintf( buf , "%s#%d" , fname,kim ) ;
00983 mri_add_name( buf , newim ) ;
00984 }
00985
00986 ADDTO_IMARR(newar,newim) ;
00987 }
00988
00989 fclose(imfile) ;
00990 RETURN(newar);
00991 }
|
|
|
Definition at line 3292 of file mri_read.c. References ADDTO_IMARR, MRI_IMAGE::foffset, MRI_IMAGE::fondisk, INIT_IMARR, L, mri_add_fname_delay(), mri_add_name(), mri_new_vol_empty(), nz, SEEK_END, and swap. Referenced by mri_read_file_delay().
03293 {
03294 int hglobal , himage , nx , ny , nz ;
03295 char fname[256] , buf[512] ;
03296 int ngood , length , kim , datum_type , datum_len , swap ;
03297 MRI_IMARR * newar ;
03298 MRI_IMAGE * newim ;
03299 FILE * imfile ;
03300
03301 /*** get info from 3D tname ***/
03302
03303 if( tname == NULL || strlen(tname) < 10 ) return NULL ;
03304
03305 switch( tname[2] ){ /* allow for 3D: or 3Ds: or 3Db: */
03306
03307 default:
03308 case ':':
03309 ngood = sscanf( tname , "3D:%d:%d:%d:%d:%d:%s" ,
03310 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
03311
03312 swap = 0 ;
03313 datum_type = MRI_short ;
03314 datum_len = sizeof(short) ; /* better be 2 */
03315 break ;
03316
03317 case 's':
03318 ngood = sscanf( tname , "3Ds:%d:%d:%d:%d:%d:%s" ,
03319 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
03320
03321 swap = 1 ;
03322 datum_type = MRI_short ;
03323 datum_len = sizeof(short) ; /* better be 2 */
03324 break ;
03325
03326 case 'b':
03327 ngood = sscanf( tname , "3Db:%d:%d:%d:%d:%d:%s" ,
03328 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
03329
03330 swap = 0 ;
03331 datum_type = MRI_byte ;
03332 datum_len = sizeof(byte) ; /* better be 1 */
03333 break ;
03334
03335 case 'f':
03336 ngood = sscanf( tname , "3Df:%d:%d:%d:%d:%d:%s" ,
03337 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
03338
03339 swap = 0 ;
03340 datum_type = MRI_float ;
03341 datum_len = sizeof(float) ; /* better be 4 */
03342 break ;
03343
03344 case 'd': /* 06 Feb 2003 */
03345 ngood = sscanf( tname , "3Dd:%d:%d:%d:%d:%d:%s" ,
03346 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
03347
03348 swap = 0 ;
03349 datum_type = MRI_float ;
03350 datum_len = sizeof(double) ; /* better be 8 */
03351 break ;
03352
03353 case 'i':
03354 ngood = sscanf( tname , "3Di:%d:%d:%d:%d:%d:%s" ,
03355 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
03356
03357 swap = 0 ;
03358 datum_type = MRI_int ;
03359 datum_len = sizeof(int) ; /* better be 4 */
03360 break ;
03361
03362 case 'c':
03363 ngood = sscanf( tname , "3Dc:%d:%d:%d:%d:%d:%s" ,
03364 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
03365
03366 swap = 0 ;
03367 datum_type = MRI_complex ;
03368 datum_len = sizeof(complex) ; /* better be 8 */
03369 break ;
03370
03371 case 'r':
03372 ngood = sscanf( tname , "3Dr:%d:%d:%d:%d:%d:%s" ,
03373 &hglobal , &himage , &nx , &ny , &nz , fname ) ;
03374
03375 swap = 0 ;
03376 datum_type = MRI_rgb ;
03377 datum_len = 3*sizeof(byte) ; /* better be 3 */
03378 break ;
03379 }
03380
03381 if( ngood < 6 || himage < 0 ||
03382 nx <= 0 || ny <= 0 || nz <= 0 ||
03383 strlen(fname) <= 0 ) return NULL ; /* bad info */
03384
03385 /*** open the input file and position it [06 Mar 2001: maybe not] ***/
03386
03387 if( strcmp(fname,"ALLZERO") != 0 ){
03388 imfile = fopen( fname , "r" ) ;
03389 if( imfile == NULL ){
03390 fprintf( stderr , "couldn't open delayed image file %s\n" , fname ) ;
03391 return NULL ;
03392 }
03393 } else {
03394 imfile = NULL ;
03395 }
03396
03397 if( imfile != NULL ){
03398 fseek( imfile , 0L , SEEK_END ) ; /* get the length of the file */
03399 length = ftell( imfile ) ;
03400
03401 /** 13 Apr 1999: modified to allow actual hglobal < -1
03402 as long as hglobal+himage >= 0 **/
03403
03404 #if 0 /* the old code */
03405 if( hglobal < 0 ){
03406 hglobal = length - nz*(datum_len*nx*ny+himage) ;
03407 if( hglobal < 0 ) hglobal = 0 ;
03408 }
03409 #else /* 13 Apr 1999 */
03410 if( hglobal == -1 || hglobal+himage < 0 ){
03411 hglobal = length - nz*(datum_len*nx*ny+himage) ;
03412 if( hglobal < 0 ) hglobal = 0 ;
03413 }
03414 #endif
03415
03416 ngood = hglobal + nz*(datum_len*nx*ny+himage) ;
03417 if( length < ngood ){
03418 fprintf( stderr,
03419 "file %s is %d bytes long but must be at least %d bytes long\n"
03420 "for hglobal=%d himage=%d nx=%d ny=%d nz=%d and voxel=%d bytes\n",
03421 fname,length,ngood,hglobal,himage,nx,ny,nz,datum_len ) ;
03422 fclose( imfile ) ;
03423 return NULL ;
03424 }
03425 fclose( imfile ) ;
03426 }
03427
03428 /*** put pointers to data in the file into the images ***/
03429
03430 INIT_IMARR(newar) ;
03431
03432 for( kim=0 ; kim < nz ; kim++ ){
03433 newim = mri_new_vol_empty( nx,ny,1 , datum_type ) ; /* empty image */
03434 mri_add_fname_delay( fname , newim ) ; /* put filename in */
03435 newim->fondisk = (swap) ? (INPUT_DELAY | BSWAP_DELAY) /* mark read type */
03436 : (INPUT_DELAY) ;
03437 newim->foffset = hglobal + (kim+1)*himage + datum_len*nx*ny*kim ;
03438
03439 if( nz == 1 ) mri_add_name( fname , newim ) ;
03440 else {
03441 sprintf( buf , "%s#%d" , fname,kim ) ;
03442 mri_add_name( buf , newim ) ;
03443 }
03444
03445 ADDTO_IMARR(newar,newim) ;
03446 }
03447
03448 return newar ;
03449 }
|
|
|
Read an ANALYZE file into an ARRAY of 2D images.
Definition at line 2502 of file mri_read.c. References ADDTO_IMARR, AFNI_noenv(), AFNI_yesenv(), ANDT_COMPLEX, ANDT_DOUBLE, ANDT_FLOAT, ANDT_RGB, ANDT_SIGNED_INT, ANDT_SIGNED_SHORT, ANDT_string, ANDT_UNSIGNED_CHAR, image_dimension::datatype, image_dimension::dim, dsr::dime, MRI_IMAGE::dw, MRI_IMAGE::dx, MRI_IMAGE::dy, MRI_IMAGE::dz, ENTRY, image_dimension::funused1, dsr::hist, INIT_IMARR, mri_add_name(), mri_data_pointer(), mri_datum_size(), mri_free(), mri_new(), mri_scale_inplace(), mri_to_float(), MRILIB_orients, nz, data_history::originator, image_dimension::pixdim, RETURN, SEEK_SET, swap, swap_2(), swap_analyze_hdr(), swap_fourbytes(), swap_twobytes(), THD_filesize(), thd_floatscan(), and MRI_IMAGE::was_swapped. Referenced by main(), mri_read_file(), and mri_read_file_delay().
02503 {
02504 FILE * fp ;
02505 char iname[1024] , buf[1024] ;
02506 int ii , jj , doswap ;
02507 struct dsr hdr ; /* ANALYZE .hdr format */
02508 int ngood , length , kim , koff , datum_type , datum_len , swap ;
02509 int nx,ny,nz , hglobal=0 , himage=0 ;
02510 float dx,dy,dz ;
02511 MRI_IMARR * newar ;
02512 MRI_IMAGE * newim ;
02513 void * imar ;
02514 float fac=0.0 ; /* 27 Nov 2001 */
02515 int floatize ; /* 28 Nov 2001 */
02516 int spmorg=0 ; /* 28 Nov 2001 */
02517
02518 ENTRY("mri_read_analyze75") ;
02519
02520 /* check & prepare filenames */
02521
02522 if( hname == NULL ) RETURN(NULL) ;
02523 jj = strlen(hname) ;
02524 if( jj < 5 ) RETURN(NULL) ;
02525 if( strcmp(hname+jj-3,"hdr") != 0 ) RETURN(NULL) ;
02526 strcpy(iname,hname) ; strcpy(iname+jj-3,"img") ;
02527
02528 /* read header file into struct */
02529
02530 fp = fopen( hname , "rb" ) ;
02531 if( fp == NULL ) RETURN(NULL) ;
02532 hdr.dime.dim[0] = 0 ;
02533 fread( &hdr , 1 , sizeof(struct dsr) , fp ) ;
02534 fclose(fp) ;
02535 if( hdr.dime.dim[0] == 0 ) RETURN(NULL) ;
02536
02537 /* check for swap-age */
02538
02539 doswap = (hdr.dime.dim[0] < 0 || hdr.dime.dim[0] > 15) ;
02540 if( doswap ) swap_analyze_hdr( &hdr ) ;
02541
02542 /* 28 Nov 2001: attempt to decode originator a la SPM */
02543
02544 { short xyzuv[5] , xx,yy,zz ;
02545 memcpy( xyzuv , hdr.hist.originator , 10 ) ;
02546 if( xyzuv[3] == 0 && xyzuv[4] == 0 ){
02547 xx = xyzuv[0] ; yy = xyzuv[1] ; zz = xyzuv[2] ;
02548 if( doswap ){ swap_2(&xx); swap_2(&yy); swap_2(&zz); }
02549 if( xx > 0 && xx < hdr.dime.dim[1] &&
02550 yy > 0 && yy < hdr.dime.dim[2] &&
02551 zz > 0 && zz < hdr.dime.dim[3] ) spmorg = 1 ;
02552 }
02553 }
02554 if( spmorg ) strcpy( MRILIB_orients , "LRPAIS" ) ;
02555
02556 /* 27 Nov 2001: get a scale factor for images */
02557
02558 if( !AFNI_noenv("AFNI_ANALYZE_SCALE") ){
02559 fac = hdr.dime.funused1 ;
02560 (void) thd_floatscan( 1 , &fac ) ;
02561 if( fac < 0.0 || fac == 1.0 ) fac = 0.0 ;
02562 }
02563
02564 floatize = (fac != 0.0 || AFNI_yesenv("AFNI_ANALYZE_FLOATIZE")) ; /* 28 Nov 2001 */
02565
02566 /* get data type into mrilib MRI_* form */
02567
02568 switch( hdr.dime.datatype ){
02569 default:
02570 fprintf(stderr,"*** %s: Unknown ANALYZE datatype=%d (%s)\n",
02571 hname,hdr.dime.datatype,ANDT_string(hdr.dime.datatype) ) ;
02572 RETURN(NULL) ;
02573
02574 case ANDT_UNSIGNED_CHAR: datum_type = MRI_byte ; break;
02575 case ANDT_SIGNED_SHORT: datum_type = MRI_short ; break;
02576 case ANDT_SIGNED_INT: datum_type = MRI_int ; break;
02577 case ANDT_FLOAT: datum_type = MRI_float ; floatize = 0; break;
02578 case ANDT_COMPLEX: datum_type = MRI_complex; floatize = 0; break;
02579 case ANDT_RGB: datum_type = MRI_rgb ; floatize = 0; break;
02580 case ANDT_DOUBLE: datum_type = MRI_double ; floatize = 0; break;
02581 }
02582
02583 datum_len = mri_datum_size(datum_type) ;
02584
02585 /* compute dimensions of images, and number of images */
02586
02587 nx = hdr.dime.dim[1] ;
02588 ny = hdr.dime.dim[2] ;
02589 if( nx < 2 || ny < 2 ) RETURN(NULL) ;
02590
02591 switch( hdr.dime.dim[0] ){
02592 case 2: nz = 1 ; break ;
02593 case 3: nz = hdr.dime.dim[3] ; break ;
02594
02595 default:
02596 case 4: nz = hdr.dime.dim[3] * hdr.dime.dim[4] ; break ;
02597 }
02598 if( nz < 1 ) nz = 1 ;
02599
02600 dx = hdr.dime.pixdim[1] ;
02601 dy = hdr.dime.pixdim[2] ;
02602 dz = hdr.dime.pixdim[3] ;
02603
02604 /** fprintf(stderr,"mri_read_analyze75: nx=%d ny=%d nz=%d\n",nx,ny,nz) ; **/
02605 /** fprintf(stderr,"mri_read_analyze75: dx=%g dy=%g dz=%g\n",dx,dy,dz) ; **/
02606
02607 /* open .img file and read images from it */
02608
02609 length = THD_filesize(iname) ;
02610 if( length <= 0 ){
02611 fprintf(stderr,"*** Can't find ANALYZE file %s\n",iname) ;
02612 RETURN(NULL) ;
02613 }
02614
02615 fp = fopen( iname , "rb" ) ;
02616 if( fp == NULL ){
02617 fprintf(stderr,"*** Can't open ANALYZE file %s\n",iname) ;
02618 RETURN(NULL) ;
02619 }
02620
02621 ngood = datum_len*nx*ny*nz ;
02622 if( length < ngood ){
02623 fprintf( stderr,
02624 "*** ANALYZE file %s is %d bytes long but must be at least %d bytes long\n"
02625 "*** for nx=%d ny=%d nz=%d and voxel=%d bytes\n",
02626 iname,length,ngood,nx,ny,nz,datum_len ) ;
02627 fclose(fp) ; RETURN(NULL) ;
02628 }
02629
02630 /*** read images from the file ***/
02631
02632 INIT_IMARR(newar) ;
02633
02634 for( kim=0 ; kim < nz ; kim++ ){
02635 koff = hglobal + (kim+1)*himage + datum_len*nx*ny*kim ;
02636 /** fprintf(stderr,"mri_read_analyze75: kim=%d koff=%d\n",kim,koff) ; **/
02637 fseek( fp , koff , SEEK_SET ) ;
02638
02639 newim = mri_new( nx , ny , datum_type ) ;
02640 imar = mri_data_pointer( newim ) ;
02641 length = fread( imar , datum_len , nx * ny , fp ) ;
02642
02643 if( doswap ){
02644 switch( datum_len ){
02645 default: break ;
02646 case 2: swap_twobytes ( nx*ny , imar ) ; break ; /* short */
02647 case 4: swap_fourbytes( nx*ny , imar ) ; break ; /* int, float */
02648 case 8: swap_fourbytes( 2*nx*ny , imar ) ; break ; /* complex */
02649 }
02650 newim->was_swapped = 1 ; /* 07 Mar 2002 */
02651 }
02652
02653 /* 28 Nov 2001: convert to floats? */
02654
02655 if( floatize ){
02656 MRI_IMAGE *qim = mri_to_float(newim) ;
02657 mri_free(newim) ; newim = qim ;
02658 }
02659
02660 if( nz == 1 ) mri_add_name( iname , newim ) ;
02661 else {
02662 sprintf( buf , "%s#%d" , iname,kim ) ;
02663 mri_add_name( buf , newim ) ;
02664 }
02665
02666 newim->dx = dx ; newim->dy = dy ; newim->dz = dz ; newim->dw = 1.0 ;
02667 ADDTO_IMARR(newar,newim) ;
02668
02669 /* 27 Nov 2001: scale image? */
02670
02671 if( fac != 0.0 ) mri_scale_inplace( fac , newim ) ;
02672 }
02673
02674 fclose(fp) ; RETURN(newar) ;
02675 }
|
|
|
Read an array of ASCII numbers into a 1D or 2D image.
Definition at line 1965 of file mri_read.c. References AFMALL, floatvec::ar, decode_linebuf(), ENTRY, EXIT, FRB, free, INC_TSARSIZE, KILL_floatvec, lbfill, LBUF, malloc, MAX, mri_1D_fromstring(), mri_add_name(), mri_fix_data_pointer(), mri_free(), mri_new_vol_empty(), mri_transpose(), my_fgets(), floatvec::nar, ncol, realloc, and RETURN. Referenced by get_dfile_params(), main(), mri_read(), and mri_read_1D().
01966 {
01967 MRI_IMAGE * outim ;
01968 int ii,jj,val , used_tsar , alloc_tsar ;
01969 float * tsar ;
01970 float ftemp ;
01971 FILE * fts ;
01972 char * ptr ;
01973 int ncol , bpos , blen , nrow ;
01974 static char *buf=NULL ; /* 20 Jun 2002: make a ptr */
01975
01976 floatvec *fvec ; /* 20 Jul 2004 */
01977 int incts ;
01978
01979 ENTRY("mri_read_ascii") ;
01980
01981 if( fname == NULL || fname[0] == '\0' ) RETURN(NULL) ;
01982
01983 if( strncmp(fname,"1D:",3) == 0 ){ /* 28 Apr 2003 */
01984 MRI_IMAGE *qim = mri_1D_fromstring( fname+3 ) ;
01985 if( qim != NULL ){
01986 outim = mri_transpose(qim); mri_free(qim); RETURN(outim);
01987 }
01988 }
01989
01990 fts = fopen( fname , "r" ); if( fts == NULL ) RETURN(NULL);
01991
01992 if( buf == NULL ) buf = AFMALL(char, LBUF) ; /* create buffer */
01993
01994 /** step 1: read in the first line and see how many numbers are in it
01995 (skipping lines that are comments or entirely blank) */
01996
01997 (void) my_fgets( NULL , 0 , NULL ) ; /* reset [20 Jul 2004] */
01998 ptr = my_fgets( buf , LBUF , fts ) ;
01999 if( ptr==NULL || *ptr=='\0' ){ FRB(buf); fclose(fts); RETURN(NULL); } /* bad read? */
02000
02001 lbfill = 0.0f ; /* 10 Aug 2004 */
02002
02003 fvec = decode_linebuf( buf ) ; /* 20 Jul 2004 */
02004 if( fvec == NULL || fvec->nar == 0 ){
02005 if( fvec != NULL ) KILL_floatvec(fvec) ;
02006 FRB(buf); fclose(fts); RETURN(NULL);
02007 }
02008 ncol = fvec->nar ; KILL_floatvec(fvec) ;
02009
02010 /** At this point, ncol is the number of floats to be read from each line **/
02011
02012 rewind( fts ) ; /* will start over */
02013
02014 incts = MAX(INC_TSARSIZE,ncol) ;
02015 used_tsar = 0 ;
02016 alloc_tsar = incts ;
02017 tsar = (float *) malloc( sizeof(float) * alloc_tsar ) ;
02018 if( tsar == NULL ){
02019 fprintf(stderr,"\n*** malloc error in mri_read_ascii ***\n"); EXIT(1);
02020 }
02021
02022 /** read lines, convert to floats, store **/
02023
02024 nrow = 0 ;
02025 while( 1 ){
02026 ptr = my_fgets( buf , LBUF , fts ) ; /* read */
02027 if( ptr==NULL || *ptr=='\0' ) break ; /* failure --> end of data */
02028
02029 fvec = decode_linebuf( buf ) ;
02030 if( fvec == NULL ) break ;
02031 if( fvec->nar == 0 ){ KILL_floatvec(fvec); break; }
02032
02033 if( used_tsar + ncol >= alloc_tsar ){
02034 alloc_tsar += incts ;
02035 tsar = (float *)realloc( (void *)tsar,sizeof(float)*alloc_tsar );
02036 if( tsar == NULL ){
02037 fprintf(stderr,"\n*** realloc error in mri_read_ascii ***\n"); EXIT(1);
02038 }
02039 }
02040 for( ii=0 ; ii < fvec->nar && ii < ncol ; ii++ )
02041 tsar[used_tsar+ii] = fvec->ar[ii] ;
02042 for( ; ii < ncol ; ii++ )
02043 tsar[used_tsar+ii] = 0.0 ;
02044 used_tsar += ncol ;
02045 KILL_floatvec(fvec) ;
02046
02047 nrow++ ; /* got one more complete row! */
02048 }
02049 fclose( fts ) ; /* finished with this file! */
02050 (void) my_fgets( NULL , 0 , NULL ) ; /* reset [20 Jul 2004] */
02051
02052 if( used_tsar <= 1 ){ FRB(buf); free(tsar); RETURN(NULL); }
02053
02054 tsar = (float *) realloc( tsar , sizeof(float) * used_tsar ) ;
02055 if( tsar == NULL ){
02056 fprintf(stderr,"\n*** final realloc error in mri_read_ascii ***\n"); EXIT(1);
02057 }
02058
02059 outim = mri_new_vol_empty( ncol , nrow , 1 , MRI_float ) ;
02060 mri_fix_data_pointer( tsar , outim ) ;
02061 mri_add_name( fname , outim ) ;
02062
02063 FRB(buf) ; RETURN(outim) ;
02064 }
|
|
||||||||||||
|
Definition at line 2173 of file mri_read.c. References AFMALL, floatvec::ar, decode_linebuf(), ENTRY, FRB, KILL_floatvec, lbfill, LBUF, MAX, mri_add_name(), MRI_FLOAT_PTR, mri_new(), my_fgets(), floatvec::nar, ncol, and RETURN. Referenced by get_options(), and main().
02174 {
02175 MRI_IMAGE *outim ;
02176 int ii,jj , ncol,nrow ;
02177 float *tsar ;
02178 FILE *fts ;
02179 char *ptr ;
02180 static char *buf=NULL ;
02181 floatvec *fvec ;
02182
02183 ENTRY("mri_read_ascii_ragged") ;
02184
02185 if( fname == NULL || *fname == '\0' ){ FRB(buf); RETURN(NULL); }
02186
02187 fts = fopen( fname , "r" ); if( fts == NULL ){ FRB(buf); RETURN(NULL); }
02188
02189 if( buf == NULL ) buf = AFMALL(char, LBUF) ;
02190
02191 /** step 1: read in ALL lines, see how many numbers are in each,
02192 in order to get the maximum row length and # of rows **/
02193
02194 lbfill = filler ; /* 10 Aug 2004 */
02195
02196 (void) my_fgets( NULL , 0 , NULL ) ; /* reset */
02197 ncol = nrow = 0 ;
02198 while(1){
02199 ptr = my_fgets( buf , LBUF , fts ) ;
02200 if( ptr==NULL || *ptr=='\0' ) break ;
02201 fvec = decode_linebuf( buf ) ;
02202 if( fvec != NULL && fvec->nar > 0 ){ nrow++; ncol = MAX(ncol,fvec->nar); }
02203 if( fvec != NULL ) KILL_floatvec(fvec) ; else break ;
02204 }
02205 if( nrow == 0 || ncol == 0 ){ fclose(fts); FRB(buf); lbfill=0.0f; RETURN(NULL); }
02206
02207 /** At this point, ncol is the number of floats to be read from each line **/
02208
02209 rewind( fts ) ; /* will start over */
02210
02211 outim = mri_new( ncol , nrow , MRI_float ) ;
02212 tsar = MRI_FLOAT_PTR(outim) ;
02213
02214 /** read lines, convert to floats, store **/
02215
02216 nrow = 0 ;
02217 while( 1 ){
02218 ptr = my_fgets( buf , LBUF , fts ) ; /* read */
02219 if( ptr==NULL || *ptr=='\0' ) break ; /* failure --> end of data */
02220
02221 fvec = decode_linebuf( buf ) ;
02222 if( fvec == NULL ) break ;
02223 if( fvec->nar == 0 ){ KILL_floatvec(fvec); break; }
02224
02225 for( ii=0 ; ii < fvec->nar && ii < ncol ; ii++ )
02226 tsar[nrow*ncol+ii] = fvec->ar[ii] ;
02227 for( ; ii < ncol ; ii++ )
02228 tsar[nrow*ncol+ii] = filler ; /* fill for incomplete lines */
02229 KILL_floatvec(fvec) ;
02230 nrow++ ; /* got one more complete row! */
02231 }
02232 fclose( fts ) ; /* finished with this file! */
02233 (void) my_fgets( NULL , 0 , NULL ) ; /* reset */
02234
02235 mri_add_name( fname , outim ) ;
02236 FRB(buf) ; lbfill = 0.0f ; RETURN(outim) ;
02237 }
|
|
|
Read one or more 2D images from a file. This function is the main point of input for to3d.c.
Definition at line 1016 of file mri_read.c. References ADDTO_IMARR, AFNI_yesenv(), check_dicom_magic_num(), ENTRY, MRI_IMAGE::fname, free, IMARR_SUBIM, imsized_fname(), INIT_IMARR, mri_read(), mri_read_3A(), mri_read_3D(), mri_read_analyze75(), mri_read_dicom(), mri_read_ge4(), mri_read_mpeg(), mri_read_siemens(), mri_read_stuff(), MRI_IMARR::num, and RETURN. Referenced by AFNI_read_images(), main(), mri_read_just_one(), mri_read_many_files(), mri_read_nsize(), REG_command_line(), and T3D_read_images().
01017 {
01018 MRI_IMARR * newar=NULL ;
01019 MRI_IMAGE * newim ;
01020 char * new_fname ;
01021
01022 ENTRY("mri_read_file") ;
01023
01024 /* convert fname to new_fname, based on environment */
01025
01026 new_fname = imsized_fname( fname ) ;
01027 if( new_fname == NULL ) RETURN( NULL );
01028
01029 /* input method is based on filename */
01030
01031 if( strlen(new_fname) > 9 &&
01032 new_fname[0] == '3' &&
01033 new_fname[1] == 'D' &&
01034 (new_fname[2] == ':' || new_fname[3] == ':') ){
01035
01036 newar = mri_read_3D( new_fname ) ; /* read from a 3D: file */
01037
01038 } else if( strlen(new_fname) > 9 &&
01039 new_fname[0] == '3' && new_fname[1] == 'A' && new_fname[3] == ':' ){
01040
01041 newar = mri_read_3A( new_fname ) ; /* from a 3A: file */
01042
01043 } else if( check_dicom_magic_num( new_fname ) ) { /* 10 Aug 2004 */
01044
01045 newar = mri_read_dicom( new_fname );
01046
01047 } else if( strstr(new_fname,".hdr") != NULL ||
01048 strstr(new_fname,".HDR") != NULL ){ /* 05 Feb 2001 */
01049
01050 newar = mri_read_analyze75( new_fname ) ; /* ANALYZE .hdr/.img filepair */
01051
01052 } else if( strstr(new_fname,".ima") != NULL ||
01053 strstr(new_fname,".IMA") != NULL ){ /* 12 Mar 2001 */
01054
01055 newar = mri_read_siemens( new_fname ) ; /* Siemens file */
01056
01057 } else if( strncmp(new_fname,"I.",2) == 0 || /* GE I.* files */
01058 strstr(new_fname,"/I.") != NULL ||
01059 strstr(new_fname,".ppm") != NULL || /* raw PPM or PGM files */
01060 strstr(new_fname,".pgm") != NULL ||
01061 strstr(new_fname,".pnm") != NULL ||
01062 strstr(new_fname,".PPM") != NULL ||
01063 strstr(new_fname,".PNM") != NULL ||
01064 strstr(new_fname,".PGM") != NULL ){ /* 05 Nov 2002 */
01065
01066 newim = mri_read( new_fname ) ; /* read from a 2D file with 1 slice */
01067
01068 if ( newim == NULL ) /* GEMS 4.x - 03 Jun 2003 [rickr] */
01069 newim = mri_read_ge4( new_fname ) ;
01070
01071 if( newim != NULL ){
01072 INIT_IMARR(newar) ;
01073 ADDTO_IMARR(newar,newim) ;
01074 }
01075
01076 } else if( strncmp(new_fname,"i.",2) == 0 || /* GEMS 4.x i.* files */
01077 strstr(new_fname,"/i.") != NULL ){ /* 03 Jun 2003 [rickr] */
01078
01079 newim = mri_read_ge4( new_fname ) ; /* 2D file with 1 slice */
01080
01081 if( newim != NULL ){
01082 INIT_IMARR(newar) ;
01083 ADDTO_IMARR(newar,newim) ;
01084 }
01085
01086 } else if( strstr(new_fname,".jpg" ) != NULL || /* various formats */
01087 strstr(new_fname,".JPG" ) != NULL || /* that we convert */
01088 strstr(new_fname,".jpeg") != NULL || /* to PPG/PGM using */
01089 strstr(new_fname,".JPEG") != NULL || /* external filters */
01090 strstr(new_fname,".gif" ) != NULL ||
01091 strstr(new_fname,".GIF" ) != NULL ||
01092 strstr(new_fname,".tif" ) != NULL ||
01093 strstr(new_fname,".TIF" ) != NULL ||
01094 strstr(new_fname,".tiff") != NULL ||
01095 strstr(new_fname,".TIFF") != NULL ||
01096 strstr(new_fname,".bmp" ) != NULL ||
01097 strstr(new_fname,".BMP" ) != NULL ||
01098 strstr(new_fname,".pbm" ) != NULL ||
01099 strstr(new_fname,".PBM" ) != NULL ||
01100 strstr(new_fname,".png" ) != NULL ||
01101 strstr(new_fname,".PNG" ) != NULL ){ /* 22 Nov 2002 */
01102
01103 newim = mri_read_stuff( new_fname ) ;
01104 if( newim != NULL ){
01105 INIT_IMARR(newar) ;
01106 ADDTO_IMARR(newar,newim) ;
01107 }
01108
01109 } else if( strstr(new_fname,".mpg" ) != NULL || /* 03 Dec 2003 */
01110 strstr(new_fname,".MPG" ) != NULL || /* read MPEGs */
01111 strstr(new_fname,".mpeg") != NULL ||
01112 strstr(new_fname,".MPEG") != NULL ){
01113
01114 newar = mri_read_mpeg( new_fname ) ; /* cf. mri_read_mpeg.c */
01115 }
01116
01117 /** failed to read anything? try DICOM format (doesn't have a fixed suffix) **/
01118 /* 05 May 2003 added option to try DICOM last KRH */
01119
01120 if( newar == NULL ){
01121
01122 if ( !AFNI_yesenv("AFNI_TRY_DICOM_LAST")) {
01123 newar = mri_read_dicom( new_fname ) ; /* cf. mri_read_dicom.c */
01124 }
01125
01126 /** if DICOM failed, try a 2D slice file, hope for the best **/
01127
01128 if( newar == NULL ){
01129 newim = mri_read( new_fname ) ;
01130 if( newim == NULL ){ free(new_fname); RETURN( NULL ); } /* give up */
01131 INIT_IMARR(newar) ;
01132 ADDTO_IMARR(newar,newim) ;
01133 }
01134
01135 if ( (newar == NULL) && AFNI_yesenv("AFNI_TRY_DICOM_LAST")) {
01136 newar = mri_read_dicom( new_fname ) ; /* cf. mri_read_dicom.c */
01137 }
01138 }
01139
01140 free(new_fname) ; /* done with the mangled filename */
01141
01142 /* 07 Mar 2002: add fname to the images, if needed */
01143
01144 if( newar != NULL && newar->num > 0 ){
01145 int ii ;
01146 for( ii=0 ; ii < newar->num ; ii++ ){
01147 newim = IMARR_SUBIM(newar,ii) ;
01148 if( newim != NULL && newim->fname == NULL )
01149 newim->fname = strdup(fname) ;
01150 }
01151 }
01152
01153 RETURN( newar );
01154 }
|
|
|
mark as already read from disk * Definition at line 3228 of file mri_read.c. References ADDTO_IMARR, AFNI_yesenv(), free, imsized_fname(), INIT_IMARR, mri_read(), mri_read_3A(), mri_read_3D_delay(), mri_read_analyze75(), mri_read_dicom(), mri_read_mpeg(), and mri_read_siemens(). Referenced by T3D_read_images().
03229 {
03230 MRI_IMARR * newar=NULL ;
03231 MRI_IMAGE * newim ;
03232 char * new_fname ;
03233
03234 new_fname = imsized_fname( fname ) ;
03235 if( new_fname == NULL ) return NULL ;
03236
03237 if( strlen(new_fname) > 9 && new_fname[0] == '3' && new_fname[1] == 'D' &&
03238 (new_fname[2] == ':' || new_fname[3] == ':') ){
03239 /* check for ':', too 3 Jan 2005 [rickr] */
03240
03241 newar = mri_read_3D_delay( new_fname ) ; /* read from a 3D file, later */
03242
03243 } else if( strlen(new_fname) > 9 &&
03244 new_fname[0] == '3' && new_fname[1] == 'A' && new_fname[3] == ':' ){
03245
03246 newar = mri_read_3A( new_fname ) ;
03247
03248 } else if( strstr(new_fname,".hdr") != NULL ||
03249 strstr(new_fname,".HDR") != NULL ){ /* 05 Feb 2001 - ANALYZE header */
03250
03251 newar = mri_read_analyze75( new_fname ) ;
03252
03253 } else if( strstr(new_fname,".ima") != NULL ||
03254 strstr(new_fname,".IMA") != NULL ){ /* 12 Mar 2001 - Siemens */
03255
03256 newar = mri_read_siemens( new_fname ) ;
03257
03258 } else if( strstr(new_fname,".mpg" ) != NULL || /* 03 Dec 2003 */
03259 strstr(new_fname,".MPG" ) != NULL || /* read MPEGs */
03260 strstr(new_fname,".mpeg") != NULL ||
03261 strstr(new_fname,".MPEG") != NULL ){
03262
03263 newar = mri_read_mpeg( new_fname ) ; /* cf. mri_read_mpeg.c */
03264 }
03265
03266 /* failed thus far? try DICOM, unless user has requested DICOM last */
03267 /* 05 May 2003 added option to try DICOM last KRH */
03268
03269 if ((newar == NULL) && !AFNI_yesenv("AFNI_TRY_DICOM_LAST")) {
03270 newar = mri_read_dicom( new_fname ) ; /* cf. mri_read_dicom.c */
03271 }
03272
03273 /* failed again? try mri_read() for 1 image */
03274
03275 if( newar == NULL ){
03276 newim = mri_read( new_fname ) ; /* read from a 2D file */
03277 if( newim == NULL ){ free(new_fname) ; return NULL ; }
03278 INIT_IMARR(newar) ;
03279 ADDTO_IMARR(newar,newim) ;
03280 }
03281
03282 if ( (newar == NULL) && AFNI_yesenv("AFNI_TRY_DICOM_LAST")) {
03283 newar = mri_read_dicom( new_fname ) ; /* cf. mri_read_dicom.c */
03284 }
03285
03286 free(new_fname) ;
03287 return newar ;
03288 }
|
|
|
Read a single 2D GEMS 4.x image.
Definition at line 597 of file mri_read.c. References MRI_IMAGE::dt, MRI_IMAGE::dw, MRI_IMAGE::dx, MRI_IMAGE::dy, MRI_IMAGE::dz, ENTRY, ge4_series_t::fov, free, ge4_read_header(), ge4_header::im_bytes, ge4_header::im_h, ge4_image_t::im_loc, ge4_header::image, mri_add_name(), mri_data_pointer(), mri_new(), RETURN, ge4_series_t::scan_mat_x, ge4_series_t::scan_mat_y, ge4_header::ser_h, ge4_header::swap, ge4_image_t::tr, MRI_IMAGE::was_swapped, and MRI_IMAGE::zo. Referenced by mri_read_file().
00598 {
00599 MRI_IMAGE * im;
00600 ge4_header H;
00601
00602 ENTRY( "mri_read_ge4" );
00603
00604 if ( filename == NULL )
00605 {
00606 fprintf( stderr, "** mri_read_ge4 - missing filename\n" );
00607 RETURN( NULL );
00608 }
00609
00610 /* try to read image file - return with image */
00611 if ( ge4_read_header( &H, filename, True ) != 0 )
00612 RETURN( NULL );
00613
00614 /* these dimensions are fixed */
00615 if ( (im = mri_new(256, 256, MRI_short)) == NULL )
00616 {
00617 free(H.image);
00618 RETURN( NULL );
00619 }
00620
00621 /* fill im struct with data from H */
00622 im->zo = H.im_h.im_loc; /* this may well be incorrect */
00623 im->dt = H.im_h.tr;
00624 im->was_swapped = H.swap;
00625
00626 if ( ( H.ser_h.fov > 1.0 ) &&
00627 ( H.ser_h.fov < 1000.0 ) &&
00628 ( H.ser_h.scan_mat_x > 0 ) &&
00629 ( H.ser_h.scan_mat_x < 1000 ) &&
00630 ( H.ser_h.scan_mat_y > 0 ) &&
00631 ( H.ser_h.scan_mat_y < 1000 ) )
00632 {
00633 /* attempt to set dx, dy and dz from these */
00634
00635 im->dx = 2 * H.ser_h.fov / H.ser_h.scan_mat_x;
00636 im->dy = im->dx;
00637 im->dz = 2 * H.ser_h.fov / H.ser_h.scan_mat_y;
00638 im->dw = 1;
00639 }
00640
00641 memcpy( mri_data_pointer(im), H.image, H.im_bytes );
00642
00643 mri_add_name( filename, im );
00644
00645 free(H.image); /* your services are no longer required */
00646
00647 RETURN( im );
00648 }
|
|
|
Like mri_read_file(), but will only return 1 2D image. If the input file has more than 1 slice, or cannot be read, then NULL is returned. Definition at line 1164 of file mri_read.c. References DESTROY_IMARR, ENTRY, free, FREE_IMARR, IMAGE_IN_IMARR, imsized_fname(), mri_read_file(), MRI_IMARR::num, and RETURN. Referenced by AFNI_make_widgets(), CALC_read_opts(), get_line_opt(), main(), and REG_command_line().
01165 {
01166 MRI_IMARR * imar ;
01167 MRI_IMAGE * im ;
01168 char * new_fname ;
01169
01170 ENTRY("mri_read_just_one") ;
01171
01172 new_fname = imsized_fname( fname ) ;
01173 if( new_fname == NULL ) RETURN( NULL );
01174
01175 imar = mri_read_file( new_fname ) ; free(new_fname) ;
01176 if( imar == NULL ) RETURN( NULL );
01177 if( imar->num != 1 ){ DESTROY_IMARR(imar) ; RETURN( NULL ); }
01178 im = IMAGE_IN_IMARR(imar,0) ;
01179 FREE_IMARR(imar) ;
01180 RETURN( im );
01181 }
|
|
||||||||||||
|
Like mri_read_file(), but returns images from many files.
Definition at line 1341 of file mri_read.c. References ADDTO_IMARR, ENTRY, FREE_IMARR, MRI_IMARR::imarr, INIT_IMARR, mri_free(), mri_read_file(), MRI_IMARR::num, and RETURN. Referenced by FTOSH_getopts(), get_line_opt(), main(), mri_read_many_nsize(), SFIM_getopts(), and TFIM_getopts().
01342 {
01343 MRI_IMARR * newar , * outar ;
01344 int kf , ii ;
01345
01346 ENTRY("mri_read_many_files") ;
01347
01348 if( nf <= 0 ) RETURN( NULL ); /* no inputs! */
01349 INIT_IMARR(outar) ; /* initialize output array */
01350
01351 for( kf=0 ; kf < nf ; kf++ ){
01352 newar = mri_read_file( fn[kf] ) ; /* read all images in this file */
01353
01354 if( newar == NULL ){ /* none? flush the output array! */
01355 fprintf(stderr,"cannot read images from file %s\n",fn[kf]) ;
01356 for( ii=0 ; ii < outar->num ; ii++ ) mri_free(outar->imarr[ii]) ;
01357 FREE_IMARR(outar) ;
01358 RETURN( NULL );
01359 }
01360
01361 for( ii=0 ; ii < newar->num ; ii++ ) /* move images to output array */
01362 ADDTO_IMARR( outar , newar->imarr[ii] ) ;
01363
01364 FREE_IMARR(newar) ; /* don't need this no more */
01365 }
01366 RETURN( outar );
01367 }
|
|
||||||||||||
|
Read many 2D images from many files. Definition at line 1483 of file mri_read.c. References ADDTO_IMARR, FREE_IMARR, IMAGE_IN_IMARR, INIT_IMARR, mri_add_name(), mri_free(), mri_nsize(), mri_read_many_files(), name, and MRI_IMARR::num.
01484 {
01485 MRI_IMARR * newar , * outar ;
01486 MRI_IMAGE * im ;
01487 int ii ;
01488
01489 newar = mri_read_many_files( nf , fn ) ;
01490 if( newar == NULL ) return NULL ;
01491
01492 INIT_IMARR(outar) ;
01493 for( ii=0 ; ii < newar->num ; ii++ ){
01494 im = mri_nsize( IMAGE_IN_IMARR(newar,ii) ) ;
01495 mri_add_name( IMAGE_IN_IMARR(newar,ii)->name , im ) ;
01496 ADDTO_IMARR(outar,im) ;
01497 mri_free( IMAGE_IN_IMARR(newar,ii) ) ;
01498 }
01499 FREE_IMARR(newar) ;
01500 return outar ;
01501 }
|
|
|
Read 1 2D image, then "nsize" it - make it a power of 2 in sizes. This was developed in the days when FD/FD2/fim ruled the world, and those programs (AJ's legacy) only deal with square images that are a power of 2 in size.
Definition at line 1465 of file mri_read.c. References DESTROY_IMARR, IMAGE_IN_IMARR, mri_add_name(), mri_nsize(), mri_read_file(), name, and MRI_IMARR::num.
01466 {
01467 MRI_IMARR *imar ;
01468 MRI_IMAGE *imout ;
01469
01470 imar = mri_read_file( fname ) ;
01471 if( imar == NULL ) return NULL ;
01472 if( imar->num != 1 ){ DESTROY_IMARR(imar) ; return NULL ; }
01473
01474 imout = mri_nsize( IMAGE_IN_IMARR(imar,0) ) ;
01475 mri_add_name( IMAGE_IN_IMARR(imar,0)->name , imout ) ;
01476
01477 DESTROY_IMARR(imar) ;
01478 return imout ;
01479 }
|
|
|
Reads a raw PPM file into 1 2D MRI_rgb-valued image.
Definition at line 1722 of file mri_read.c. References ENTRY, maxval, mri_add_name(), mri_free(), mri_new(), MRI_RGB_PTR, NUMSCAN, and RETURN. Referenced by IM_main(), main(), mri_read(), mri_read_mpeg(), and SUMA_read_ppm().
01723 {
01724 int ch , nch , nx,ny,maxval , length ;
01725 MRI_IMAGE * rgbim ;
01726 FILE * imfile ;
01727 byte * rgby ;
01728 char buf[256] ;
01729
01730 ENTRY("mri_read_ppm") ;
01731
01732 /*** open input file ***/
01733
01734 imfile = fopen( fname , "r" ) ;
01735 if( imfile == NULL ) RETURN(NULL);
01736
01737 /*** check if a raw PPM file ***/
01738
01739 ch = getc( imfile ) ; if( ch != 'P' ) { fclose(imfile) ; RETURN(NULL); }
01740 ch = getc( imfile ) ; if( ch != '6' ) { fclose(imfile) ; RETURN(NULL); }
01741
01742 /* magic P6 found, so read numbers in header */
01743
01744 ch = getc(imfile) ;
01745
01746 NUMSCAN(nx) ; if( nx <= 0 ) { fclose(imfile); RETURN(NULL); }
01747 NUMSCAN(ny) ; if( ny <= 0 ) { fclose(imfile); RETURN(NULL); }
01748 NUMSCAN(maxval); if( maxval <= 0 ||
01749 maxval > 255 ){ fclose(imfile); RETURN(NULL); }
01750
01751 /*** create output image ***/
01752
01753 rgbim = mri_new( nx , ny , MRI_rgb ) ; mri_add_name( fname , rgbim ) ;
01754 rgby = MRI_RGB_PTR(rgbim) ;
01755
01756 /*** read all data into image array */
01757
01758 length = fread( rgby , sizeof(byte) , 3*nx*ny , imfile ) ;
01759 fclose( imfile ) ;
01760
01761 if( length != 3*nx*ny ){ mri_free(rgbim) ; RETURN(NULL) ; }
01762
01763 /* 17 Sep 2001: scale to maxval=255, if needed */
01764
01765 if( maxval < 255 ){
01766 int ii ; float fac = 255.4/maxval ;
01767 for( ii=0 ; ii < 3*nx*ny ; ii++ ) rgby[ii] = (byte)( rgby[ii]*fac ) ;
01768 }
01769
01770 RETURN(rgbim) ;
01771 }
|
|
|
Read a raw PPM file into 3 byte-valued MRI_IMAGEs.
Definition at line 1376 of file mri_read.c. References ADDTO_IMARR, ENTRY, EXIT, free, INIT_IMARR, malloc, maxval, mri_add_name(), mri_data_pointer(), mri_free(), mri_new(), NUMSCAN, and RETURN. Referenced by main().
01377 {
01378 int ch , nch , nx,ny,maxval , length , npix,ii ;
01379 char buf[512] ;
01380 MRI_IMAGE *rim , *gim , *bim ;
01381 MRI_IMARR * outar ;
01382 FILE * imfile ;
01383 byte * rby , * gby , * bby , * rgby ;
01384
01385 ENTRY("mri_read_ppm3") ;
01386
01387 /*** open input file ***/
01388
01389 imfile = fopen( fname , "r" ) ;
01390 if( imfile == NULL ){
01391 fprintf(stderr,"couldn't open file %s in mri_read_ppm3\n",fname); RETURN(NULL) ;
01392 }
01393
01394 /*** check if a raw PPM file ***/
01395
01396 ch = getc( imfile ) ; if( ch != 'P' ) { fclose(imfile) ; RETURN(NULL); }
01397 ch = getc( imfile ) ; if( ch != '6' ) { fclose(imfile) ; RETURN(NULL); }
01398
01399 /* magic P6 found, so read numbers in header */
01400
01401 ch = getc(imfile) ;
01402
01403 NUMSCAN(nx) ; if( nx <= 0 ) { fclose(imfile) ; RETURN(NULL); }
01404 NUMSCAN(ny) ; if( ny <= 0 ) { fclose(imfile) ; RETURN(NULL); }
01405 NUMSCAN(maxval) ; if( maxval <= 0 ||
01406 maxval > 255 ) { fclose(imfile) ; RETURN(NULL); }
01407
01408 /*** create output images and workspace array ***/
01409
01410 rim = mri_new( nx , ny , MRI_byte ) ; rby = mri_data_pointer( rim ) ;
01411 gim = mri_new( nx , ny , MRI_byte ) ; gby = mri_data_pointer( gim ) ;
01412 bim = mri_new( nx , ny , MRI_byte ) ; bby = mri_data_pointer( bim ) ;
01413
01414 sprintf(buf,"%s#R",fname) ; mri_add_name( buf , rim ) ;
01415 sprintf(buf,"%s#G",fname) ; mri_add_name( buf , gim ) ;
01416 sprintf(buf,"%s#B",fname) ; mri_add_name( buf , bim ) ;
01417
01418 rgby = (byte *) malloc( sizeof(byte) * 3*nx*ny ) ;
01419 if( rgby == NULL ){
01420 fprintf(stderr,"couldn't malloc workspace in mri_read_ppm3!\n") ; EXIT(1) ;
01421 }
01422
01423 /*** read all data into workspace array ***/
01424
01425 length = fread( rgby , sizeof(byte) , 3*nx*ny , imfile ) ;
01426 fclose( imfile ) ;
01427
01428 if( length != 3*nx*ny ){
01429 free(rgby) ; mri_free(rim) ; mri_free(gim) ; mri_free(bim) ;
01430 fprintf(stderr,"couldn't read data from file %s in mri_read_ppm3\n",fname) ;
01431 RETURN(NULL);
01432 }
01433
01434 /*** put data from workspace array into output images ***/
01435
01436 npix = nx*ny ;
01437 for( ii=0 ; ii < npix ; ii++ ){
01438 rby[ii] = rgby[3*ii ] ;
01439 gby[ii] = rgby[3*ii+1] ;
01440 bby[ii] = rgby[3*ii+2] ;
01441 }
01442 free( rgby ) ;
01443
01444 /*** create output image array ***/
01445
01446 INIT_IMARR(outar) ;
01447 ADDTO_IMARR( outar , rim ) ;
01448 ADDTO_IMARR( outar , gim ) ;
01449 ADDTO_IMARR( outar , bim ) ;
01450 RETURN(outar);
01451 }
|
|
||||||||||||||||
|
Read the header from PPM file and return its info.
Definition at line 1680 of file mri_read.c. References ENTRY, and NUMSCAN.
01681 {
01682 FILE *imfile ;
01683 int ch , nch , nxx,nyy ;
01684 char buf[256] ;
01685
01686 ENTRY("mri_read_ppm_header") ;
01687
01688 if( fname == NULL || nx == NULL || ny == NULL ) EXRETURN ;
01689
01690 *nx = *ny = 0 ; /* default returns */
01691
01692 /*** open input file ***/
01693
01694 imfile = fopen( fname , "r" ) ; if( imfile == NULL ) EXRETURN ;
01695
01696 /*** check if a raw PPM file ***/
01697
01698 ch = getc( imfile ) ; if( ch != 'P' ) { fclose(imfile) ; EXRETURN ; }
01699 ch = getc( imfile ) ; if( ch != '6' ) { fclose(imfile) ; EXRETURN ; }
01700
01701 /* magic P6 found, so read numbers in header */
01702
01703 ch = getc(imfile) ;
01704
01705 NUMSCAN(nxx) ; if( nxx <= 0 ){ fclose(imfile) ; EXRETURN ; }
01706 NUMSCAN(nyy) ; if( nyy <= 0 ){ fclose(imfile) ; EXRETURN ; }
01707
01708 /* return dimensions */
01709
01710 fclose(imfile) ; *nx = nxx ; *ny = nyy ; EXRETURN ;
01711 }
|
|
|
Read an array of 2D images from Siemens Vision .ima file. The images are stored in a 2D array, which requires untangling the data rows to put them into separate MRI_IMAGE structs. Definition at line 2955 of file mri_read.c. References ADDTO_IMARR, calloc, Siemens_vision_header::DisplayMatrixSize, MRI_IMAGE::dw, MRI_IMAGE::dx, MRI_IMAGE::dy, MRI_IMAGE::dz, ENTRY, Siemens_vision_header::FOVColumn, Siemens_vision_header::FOVRow, free, FREE_IMARR, getenv(), i, IMARR_COUNT, IMARR_SUBIM, INIT_IMARR, mri_add_name(), mri_new(), MRI_SHORT_PTR, MRILIB_orients, MRILIB_zoff, nz, Siemens_vision_header::OrientationSet1Back, Siemens_vision_header::OrientationSet1Left, Siemens_vision_header::OrientationSet1Top, Siemens_vision_header::OrientationSet2Down, Siemens_vision_header::OrientationSet2Front, Siemens_vision_header::OrientationSet2Right, RETURN, SEEK_SET, SIEMENS_HEADERSIZE, Siemens_vision_header::SiemensStudyDateMM, Siemens_vision_header::SliceThickness, strtod(), swap, swap_4(), swap_8(), swap_twobytes(), Siemens_vision_header::TextSlicePosition, use_MRILIB_zoff, and MRI_IMAGE::was_swapped. Referenced by mri_read_file(), and mri_read_file_delay().
02956 {
02957 struct Siemens_vision_header head ;
02958 FILE * fp ;
02959 int i,j,xx,yy , matrix , swap , imagesize,nxx,blank , slices,nz ;
02960 struct stat file_stat ;
02961 short *imar ;
02962 MRI_IMARR * newar ;
02963 MRI_IMAGE * newim ;
02964 short * nar ;
02965 char buf[256] ;
02966 float dx,dy,dz ;
02967 char *eee ; int ileave=0 ; /* 25 Sep 2001 */
02968
02969 ENTRY("mri_read_siemens") ;
02970
02971 /*--- check file size ---*/
02972
02973 if( hname == NULL ) RETURN(NULL) ;
02974
02975 i = stat( hname , &file_stat ) ;
02976 if( i < 0 ) RETURN(NULL) ;
02977
02978 /*--- read header data ---*/
02979
02980 fp = fopen( hname , "rb" ) ;
02981 if( fp == NULL ) RETURN(NULL) ;
02982 fread( &head , sizeof(struct Siemens_vision_header) , 1 , fp ) ;
02983
02984 /*-- check some integer in header to determine if we need to byteswap --*/
02985
02986 swap = ( head.SiemensStudyDateMM < 0 || head.SiemensStudyDateMM > 13 ) ;
02987 if( swap ){
02988 swap_4( &(head.SiemensStudyDateMM) ) ;
02989 if( head.SiemensStudyDateMM < 0 || head.SiemensStudyDateMM > 13 ){
02990 swap = 0 ;
02991 }
02992 }
02993
02994 /*-- find image size from header --*/
02995
02996 if( swap ) swap_4( &(head.DisplayMatrixSize) ) ;
02997 imagesize = head.DisplayMatrixSize ;
02998
02999 /*-- determine number of sub-images in file --*/
03000
03001 #undef MATRIX_MAX
03002 #define MATRIX_MAX 16
03003
03004 i = 2*imagesize*imagesize ;
03005 for( matrix=1 ; matrix < MATRIX_MAX ; matrix++ )
03006 if( file_stat.st_size == i*matrix*matrix + SIEMENS_HEADERSIZE ) break ;
03007
03008 if( matrix == MATRIX_MAX ){
03009 fclose(fp) ; RETURN(NULL) ; /* didn't recognize file format */
03010 }
03011 #undef MATRIX_MAX
03012
03013 /*-- read image data from file and byteswap it, if needed --*/
03014
03015 imar = (short *) calloc(sizeof(short),matrix*matrix*imagesize*imagesize) ;
03016 fseek( fp , SIEMENS_HEADERSIZE , SEEK_SET ) ;
03017 fread( imar , sizeof(short) , matrix*matrix*imagesize*imagesize , fp ) ;
03018 fclose(fp) ;
03019
03020 if( swap ) swap_twobytes( matrix*matrix*imagesize*imagesize , imar ) ;
03021
03022 /*-- count slices - all zero (blank) slices at end are skipped --*/
03023
03024 slices = 0 ; nxx = matrix*imagesize ;
03025
03026 for( yy=0 ; yy < matrix ; yy++ ){ /* rows in array of sub-images */
03027 for( xx=0 ; xx < matrix ; xx++ ){ /* cols in array of sub-images */
03028 blank = 1 ;
03029 for( j=0 ; j < imagesize ; j++ ){ /* row in sub-image */
03030 for( i=0 ; i < imagesize ; i++ ){ /* col in sub-image */
03031 if( imar[i+xx*imagesize+(j+yy*imagesize)*nxx] ) blank = 0 ;
03032 }
03033 }
03034 if( !blank ) slices = 1 + xx + yy*matrix ;
03035 }
03036 }
03037
03038 if( slices == 0 ){ free(imar) ; RETURN(NULL) ; } /* bad news */
03039
03040 /*-- get image dimensions, etc --*/
03041
03042 if( swap ){
03043 swap_8(&(head.FOVRow));
03044 swap_8(&(head.FOVColumn));
03045 swap_8(&(head.SliceThickness));
03046 }
03047 dx = head.FOVRow / imagesize ;
03048 dy = head.FOVColumn / imagesize ;
03049 dz = head.SliceThickness ;
03050
03051 /*-- save orientation and offset in global variables --*/
03052
03053 MRILIB_orients[0] = head.OrientationSet1Left[0] ;
03054 MRILIB_orients[1] = head.OrientationSet2Right[0];
03055 MRILIB_orients[2] = head.OrientationSet1Top[0] ;
03056 MRILIB_orients[3] = head.OrientationSet2Down[0] ;
03057 MRILIB_orients[4] = head.OrientationSet1Back[0] ;
03058 MRILIB_orients[5] = head.OrientationSet2Front[0];
03059 for (i=0; i<6; i++) {
03060 if (MRILIB_orients[i]=='H') MRILIB_orients[i]='S';
03061 if (MRILIB_orients[i]=='F') MRILIB_orients[i]='I';
03062 }
03063 MRILIB_orients[6] = '\0' ;
03064 MRILIB_zoff = fabs(strtod(head.TextSlicePosition,NULL)) ; use_MRILIB_zoff = 1 ;
03065
03066 /*-- create output --*/
03067
03068 INIT_IMARR(newar) ;
03069
03070 for( yy=0 ; yy < matrix ; yy++ ){ /* rows in array of sub-images */
03071 for( xx=0 ; xx < matrix ; xx++ ){ /* cols in array of sub-images */
03072
03073 newim = mri_new( imagesize , imagesize , MRI_short ) ;
03074 nar = MRI_SHORT_PTR( newim ) ;
03075
03076 if( swap ) newim->was_swapped = 1 ; /* 07 Mar 2002 */
03077
03078 for( j=0 ; j < imagesize ; j++ ) /* row in sub-image */
03079 memcpy( nar+j*imagesize ,
03080 imar+xx*imagesize+(j+yy*imagesize)*nxx , 2*imagesize ) ;
03081
03082 sprintf( buf , "%s#%d:%d" , hname,xx,yy ) ;
03083 mri_add_name( buf , newim ) ;
03084
03085 newim->dx = dx ; newim->dy = dy ; newim->dz = dz ; newim->dw = 1.0 ;
03086 ADDTO_IMARR(newar,newim) ;
03087 if( IMARR_COUNT(newar) == slices ) goto Done ; /* Aauugghh!!! */
03088 }
03089 }
03090
03091 Done:
03092
03093 /*-- 25 Sep 2001: possibly interleave the images --*/
03094
03095 eee = getenv("AFNI_SIEMENS_INTERLEAVE") ;
03096 ileave = ( (eee != NULL) && (*eee=='Y' || *eee=='y') ) ;
03097 if( ileave && slices > 2 ){
03098 int mid = (slices-1)/2 ; /* midpoint */
03099 MRI_IMARR *qar ; /* new image array */
03100 INIT_IMARR(qar) ;
03101 for( i=0 ; i < slices ; i++ ){
03102 if( i%2 == 0 ) j = i/2 ; /* slice #i is in newar #j */
03103 else j = mid + (i+1)/2 ;
03104 ADDTO_IMARR(qar,IMARR_SUBIM(newar,j)) ; /* move image to new array */
03105 }
03106 FREE_IMARR(newar) ; newar = qar ;
03107 }
03108
03109 free(imar) ; RETURN(newar) ;
03110 }
|
|
||||||||||||
|
Try to read a "Cox nD MRI" image file (fat chance). Definition at line 721 of file mri_read.c. References ENTRY, mri_new_7D_generic(), NUMSCAN, nz, RETURN, SEEK_SET, and skip. Referenced by mri_read().
00722 {
00723 int ch , nch , nx,ny,nz,nt,nu,nv,nw , imcode , ndim ;
00724 char buf[64] ;
00725 MRI_IMAGE *im ;
00726
00727 ENTRY("mri_try_7D") ;
00728
00729 fseek( imfile , 0 , SEEK_SET ) ; /* rewind file */
00730
00731 ch = getc( imfile ) ; if( ch != 'M' ) RETURN( NULL ); /* check for MR[1-7] */
00732 ch = getc( imfile ) ; if( ch != 'R' ) RETURN( NULL );
00733 ch = getc( imfile ) ;
00734 switch( ch ){
00735 default: RETURN( NULL ); /* not what I expected */
00736
00737 case '1': ndim = 1 ; break ;
00738 case '2': ndim = 2 ; break ;
00739 case '3': ndim = 3 ; break ;
00740 case '4': ndim = 4 ; break ;
00741 case '5': ndim = 5 ; break ;
00742 case '6': ndim = 6 ; break ;
00743 case '7': ndim = 7 ; break ;
00744 }
00745 /* magic MR? found, so read numbers */
00746
00747 ch = getc(imfile) ;
00748 NUMSCAN(imcode) ;
00749
00750 nx = ny = nz = nt = nu = nv = nw = 1 ;
00751
00752 NUMSCAN(nx) ; if( nx <= 0 ) RETURN( NULL );
00753 if( ndim > 1 ){ NUMSCAN(ny) ; if( ny <= 0 ) RETURN( NULL ); }
00754 if( ndim > 2 ){ NUMSCAN(nz) ; if( nz <= 0 ) RETURN( NULL ); }
00755 if( ndim > 3 ){ NUMSCAN(nt) ; if( nt <= 0 ) RETURN( NULL ); }
00756 if( ndim > 4 ){ NUMSCAN(nu) ; if( nu <= 0 ) RETURN( NULL ); }
00757 if( ndim > 5 ){ NUMSCAN(nv) ; if( nv <= 0 ) RETURN( NULL ); }
00758 if( ndim > 6 ){ NUMSCAN(nw) ; if( nw <= 0 ) RETURN( NULL ); }
00759
00760 *skip = ftell(imfile) ;
00761 im = mri_new_7D_generic( nx,ny,nz,nt,nu,nv,nw , imcode , TRUE ) ;
00762 RETURN( im );
00763 }
|
|
||||||||||||
|
Try to read an file in the "Cox MRI" format.
Definition at line 688 of file mri_read.c. References ENTRY, mri_new(), NUMSCAN, RETURN, SEEK_SET, and skip. Referenced by mri_read().
00689 {
00690 int ch , nch , nx,ny,imcode ;
00691 char buf[64] ;
00692 MRI_IMAGE *im ;
00693
00694 ENTRY("mri_try_mri") ;
00695
00696 fseek( imfile , 0 , SEEK_SET ) ; /* rewind file */
00697
00698 ch = getc( imfile ) ; if( ch != 'M' ) RETURN( NULL ); /* check for MRI */
00699 ch = getc( imfile ) ; if( ch != 'R' ) RETURN( NULL );
00700 ch = getc( imfile ) ; if( ch != 'I' ) RETURN( NULL );
00701
00702 /* magic MRI found, so read numbers */
00703
00704 ch = getc(imfile) ;
00705
00706 NUMSCAN(imcode) ;
00707 NUMSCAN(nx) ; if( nx <= 0 ) RETURN( NULL );
00708 NUMSCAN(ny) ; if( ny <= 0 ) RETURN( NULL );
00709
00710 *skip = ftell(imfile) ;
00711 im = mri_new( nx , ny , imcode ) ;
00712 RETURN( im );
00713 }
|
|
||||||||||||
|
Try to read a raw PGM format image file.
Definition at line 777 of file mri_read.c. References ENTRY, maxval, mri_new(), NUMSCAN, RETURN, SEEK_SET, and skip. Referenced by mri_read().
00778 {
00779 int ch , nch , nx,ny,maxval ;
00780 char buf[64] ;
00781 MRI_IMAGE *im ;
00782
00783 ENTRY("mri_try_pgm") ;
00784
00785 fseek( imfile , 0 , SEEK_SET ) ; /* rewind file */
00786
00787 ch = getc( imfile ) ; if( ch != 'P' ) RETURN(NULL); /* check for magic */
00788 ch = getc( imfile ) ; if( ch != '5' ) RETURN(NULL);
00789
00790 /* magic P5 found, so read numbers */
00791
00792 ch = getc(imfile) ;
00793
00794 NUMSCAN(nx) ; if( nx <= 0 ) RETURN(NULL);
00795 NUMSCAN(ny) ; if( ny <= 0 ) RETURN(NULL);
00796 NUMSCAN(maxval) ; if( maxval <= 0 || maxval > 255 ) RETURN(NULL);
00797
00798 *skip = ftell(imfile) ;
00799 im = mri_new( nx , ny , MRI_byte ) ;
00800 RETURN(im);
00801 }
|
|
||||||||||||||||
|
[20 Jun 2002] Like fgets, but also
Definition at line 1792 of file mri_read.c. References AFMALL, free, LBUF, and realloc.
01793 {
01794 char *ptr ;
01795 int nbuf , ll,ii , cflag ;
01796 static char *qbuf=NULL ;
01797
01798 #ifdef USE_LASTBUF
01799 static char *lastbuf = NULL ; /* 20 Jul 2004 */
01800 static int nlastbuf = 0 ;
01801
01802 if( buf == NULL && lastbuf != NULL ){ /* 20 Jul 2004 */
01803 free((void *)lastbuf); lastbuf = NULL; nlastbuf = 0 ;
01804 }
01805 #endif
01806
01807 if( buf == NULL && qbuf != NULL ){ free((void *)qbuf); qbuf = NULL; }
01808
01809 if( buf == NULL || size < 1 || fts == NULL ) return NULL ;
01810
01811 if( qbuf == NULL ) qbuf = AFMALL(char, LBUF) ; /* 1st time in */
01812
01813 nbuf = 0 ; /* num bytes stored in buf so far */
01814 cflag = 0 ; /* flag if we're catenating lines */
01815
01816 while(1){ /* loop and read lines, creating a logical line */
01817
01818 ptr = fgets( qbuf , LBUF , fts ) ; /* read next whole line */
01819
01820 if( ptr == NULL ) break ; /* must be end-of-file */
01821
01822 /* skip leading whitespace */
01823
01824 for( ; *ptr != '\0' && isspace(*ptr) ; ptr++ ) ; /* nada */
01825
01826 /* skip entirely blank lines, unless we are catenating */
01827
01828 if( *ptr == '\0' ){ if(cflag) break; else continue; }
01829
01830 #ifdef USE_LASTBUF
01831 /* if a duplicate is requested, return it now [20 Jul 2004] */
01832
01833 if( *ptr == '"' && *(ptr+1) == '"' && nlastbuf > 0 && nbuf == 0 ){
01834 ll = strlen(lastbuf) ; if( ll >= size ) ll = size-1 ;
01835 memcpy(buf,lastbuf,ll-1) ; buf[ll] = '\0' ;
01836 return buf ;
01837 }
01838 #endif
01839
01840 /* skip comment lines (even if we are catenating) */
01841
01842 if( *ptr == '#' || (*ptr == '/' && *(ptr+1) == '/') ) continue ;
01843
01844 /* strip trailing whitespace */
01845
01846 ll = strlen(ptr) ; /* will be > 0 */
01847 for( ii=ll-1 ; isspace(ptr[ii]) && ii > 0 ; ii-- ) /* blank => NUL */
01848 ptr[ii] = '\0' ;
01849
01850 ll = strlen(ptr) ; /* number of chars left */
01851 if( ll == 0 ) continue ; /* should not happen */
01852
01853 cflag = (ptr[ll-1] == '\\') ; /* catenate next line? */
01854 if( cflag ) ptr[ll-1] = ' ' ; /* replace '\' with ' ' */
01855
01856 /* now copy what's left (ll+1 bytes) at tail of output buffer */
01857
01858 if( nbuf+ll+1 > size ){ /* too much for output buffer? */
01859 ll = size - (nbuf+1) ;
01860 if( ll <= 0 ) break ; /* should not happen */
01861 }
01862
01863 memcpy(buf+nbuf,ptr,ll+1) ; nbuf += ll ;
01864 if( !cflag ) break ;
01865
01866 } /* loop to get next line if catenation is turned on */
01867
01868 #ifdef LASTBUF
01869 /* make a copy of result in lastbuf [20 Jul 2004] */
01870
01871 ll = strlen(buf) ;
01872 if( ll+1 > nlastbuf ){
01873 nlastbuf = ll+2 ; lastbuf = (char *)realloc((void *)lastbuf,nlastbuf) ;
01874 }
01875 memcpy(lastbuf,buf,ll+1) ;
01876 #endif
01877
01878 /* and we is done */
01879
01880 if( nbuf > 0 ) return buf ; /* return what we read already */
01881 return NULL ; /* signal of failure get data */
01882 }
|
|
|
My version of strdup(), which won't fail if the input is NULL. Definition at line 1578 of file mri_read.c. References malloc. Referenced by imsized_fname().
01579 {
01580 char * new_str ;
01581 if( str == NULL ) return NULL ;
01582 new_str = (char *) malloc( sizeof(char) * (strlen(str)+1) ) ;
01583 if( new_str != NULL ) strcpy( new_str , str ) ;
01584 return new_str ;
01585 }
|
|
||||||||||||||||
|
read lines, convert to floats, store * Definition at line 2243 of file mri_read.c. References EXIT, free, INC_TSARSIZE, LBUF, malloc, and realloc. Referenced by mri_read_3A().
02244 {
02245 int ii,jj,val , used_tsar , alloc_tsar ;
02246 float *tsar ;
02247 float ftemp ;
02248 FILE *fts ;
02249 char *buf ; /* 08 Jul 2004: malloc this now, instead of auto */
02250 char *ptr ;
02251 int bpos , blen , nrow ;
02252
02253 /* check inputs */
02254
02255 if( nff == NULL || ff == NULL ) return ;
02256 if( fname == NULL || fname[0] == '\0' ){ *nff=0 ; *ff=NULL ; return ; }
02257
02258 fts = fopen( fname , "r" ) ;
02259 if( fts == NULL ){ *nff=0 ; *ff=NULL ; return ; }
02260
02261 /* make some space */
02262
02263 used_tsar = 0 ;
02264 alloc_tsar = INC_TSARSIZE ;
02265 tsar = (float *) malloc( sizeof(float) * alloc_tsar ) ;
02266 if( tsar == NULL ){
02267 fprintf(stderr,"\n*** malloc fails: read_ascii_floats ***\n"); EXIT(1);
02268 }
02269
02270 /** read lines, convert to floats, store **/
02271
02272 nrow = 0 ;
02273 buf = (char *)malloc(LBUF) ;
02274 while( 1 ){
02275 ptr = fgets( buf , LBUF , fts ) ; /* read */
02276 if( ptr == NULL ) break ; /* failure --> end of data */
02277 blen = strlen(buf) ;
02278 if( blen <= 0 ) break ; /* nothing --> end of data */
02279
02280 for( ii=0 ; ii < blen && isspace(buf[ii]) ; ii++ ) ; /* skip blanks */
02281
02282 if( ii == blen ) continue ; /* skip all blank line */
02283 if( buf[ii] == '#' ) continue ; /* skip a comment line */
02284 if( buf[ii] == '!' ) continue ;
02285
02286 /* convert commas to blanks */
02287
02288 for( jj=ii ; jj < blen ; jj++ ) if( buf[jj] == ',' ) buf[jj] = ' ' ;
02289
02290 for( bpos=ii ; bpos < blen ; ){
02291 val = sscanf( buf+bpos , "%f%n" , &ftemp , &jj ) ; /* read from string */
02292 if( val < 1 ) break ; /* bad read? */
02293 bpos += jj ; /* start of next read */
02294
02295 if( used_tsar == alloc_tsar ){
02296 alloc_tsar += INC_TSARSIZE ;
02297 tsar = (float *)realloc( tsar,sizeof(float)*alloc_tsar );
02298 if( tsar == NULL ){
02299 fprintf(stderr,"\n*** realloc fails: read_ascii_floats ***\n"); EXIT(1);
02300 }
02301 }
02302
02303 tsar[used_tsar++] = ftemp ; /* store input */
02304 }
02305
02306 nrow++ ; /* got one more complete row! */
02307 }
02308 fclose( fts ) ; /* finished with this file! */
02309 free( buf ) ;
02310
02311 if( used_tsar <= 1 ){ free(tsar); *nff=0; *ff=NULL; return; }
02312
02313 tsar = (float *) realloc( tsar , sizeof(float) * used_tsar ) ;
02314 if( tsar == NULL ){
02315 fprintf(stderr,"\n*** final realloc fails: read_ascii_floats ***\n"); EXIT(1);
02316 }
02317
02318 *nff = used_tsar; *ff = tsar; return;
02319 }
|
|
|
Swap the 2 bytes pointed to by ppp: ab -> ba. Definition at line 169 of file mri_read.c.
00170 {
00171 unsigned char *pntr = (unsigned char *) ppp ;
00172 unsigned char b0, b1;
00173
00174 b0 = *pntr; b1 = *(pntr+1);
00175 *pntr = b1; *(pntr+1) = b0;
00176 }
|
|
|
Swap the 4 bytes pointed to by ppp: abcd -> dcba. Definition at line 139 of file mri_read.c.
00140 {
00141 unsigned char *pntr = (unsigned char *) ppp ;
00142 unsigned char b0, b1, b2, b3;
00143
00144 b0 = *pntr; b1 = *(pntr+1); b2 = *(pntr+2); b3 = *(pntr+3);
00145 *pntr = b3; *(pntr+1) = b2; *(pntr+2) = b1; *(pntr+3) = b0;
00146 }
|
|
|
Swap the 8 bytes pointed to by ppp: abcdefgh -> hgfedcba. Definition at line 152 of file mri_read.c.
00153 {
00154 unsigned char *pntr = (unsigned char *) ppp ;
00155 unsigned char b0, b1, b2, b3;
00156 unsigned char b4, b5, b6, b7;
00157
00158 b0 = *pntr ; b1 = *(pntr+1); b2 = *(pntr+2); b3 = *(pntr+3);
00159 b4 = *(pntr+4); b5 = *(pntr+5); b6 = *(pntr+6); b7 = *(pntr+7);
00160
00161 *pntr = b7; *(pntr+1) = b6; *(pntr+2) = b5; *(pntr+3) = b4;
00162 *(pntr+4) = b3; *(pntr+5) = b2; *(pntr+6) = b1; *(pntr+7) = b0;
00163 }
|
|
Variable Documentation
|
|
Array of preset file sizes to use when reading image files. Definition at line 126 of file mri_read.c. |
|
|
Definition at line 1885 of file mri_read.c. Referenced by decode_linebuf(), mri_read_ascii(), and mri_read_ascii_ragged(). |
|
|
If this < 0 ==> must initialize array of preset file sizes. Definition at line 130 of file mri_read.c. Referenced by imsized_fname(), and init_MCW_sizes(). |
|
|
Global variable to signal image orientation, if possible. Definition at line 36 of file mri_read.c. Referenced by mri_read(), mri_read3D_analyze75(), mri_read_analyze75(), and mri_read_siemens(). |
|
|
Global variable giving the spacing between slice centers. Definition at line 96 of file mri_read.c. Referenced by mri_read(). |
|
|
Global variable to signal image TR, if possible. Definition at line 44 of file mri_read.c. Referenced by mri_read(). |
|
|
Global vector pointing in direction of x-axis. Definition at line 72 of file mri_read.c. |
|
|
Global variable to signal image x offset, if possible. Definition at line 48 of file mri_read.c. Referenced by mri_read(). |
|
|
Global vector pointing in direction of y-axis. Definition at line 80 of file mri_read.c. |
|
|
Global variable to signal image y offset, if possible. Definition at line 52 of file mri_read.c. Referenced by mri_read(). |
|
|
Global vector pointing in direction of y-axis. Definition at line 88 of file mri_read.c. |
|
|
Global variable to signal image slice offset, if possible. Definition at line 40 of file mri_read.c. Referenced by mri_read(), and mri_read_siemens(). |
|
|
Global variable saying whether to use MRILIB_slicespacing. Definition at line 92 of file mri_read.c. Referenced by mri_read(). |
|
|
Global variable saying whether to use MRILIB_xcos. Definition at line 68 of file mri_read.c. |
|
|
Global variable saying whether to use MRILIB_xoff. Definition at line 56 of file mri_read.c. Referenced by mri_read(). |
|
|
Global variable saying whether to use MRILIB_ycos. Definition at line 76 of file mri_read.c. |
|
|
Global variable saying whether to use MRILIB_yoff. Definition at line 60 of file mri_read.c. Referenced by mri_read(). |
|
|
Global variable saying whether to use MRILIB_zcos. Definition at line 84 of file mri_read.c. |
|
|
Global variable saying whether to use MRILIB_zoff. Definition at line 64 of file mri_read.c. Referenced by mri_read(), and mri_read_siemens(). |