1 /*****************************************************************************
2 Major portions of this software are copyrighted by the Medical College
3 of Wisconsin, 1994-2000, and are released under the Gnu General Public
4 License, Version 2. See the file README.Copyright for details.
5 ******************************************************************************/
6
7 #include "mrilib.h"
8
9 /*** 7D SAFE ***/
10
11 /*-----------------------------------------------------
12 Convert input image to the type given by "datum".
13 -------------------------------------------------------*/
14
mri_to_mri(int datum,MRI_IMAGE * oldim)15 MRI_IMAGE * mri_to_mri( int datum , MRI_IMAGE *oldim )
16 {
17 MRI_IMAGE *newim ;
18
19 ENTRY("mri_to_mri") ;
20
21 if( oldim == NULL ) RETURN( NULL ); /* 09 Feb 1999 */
22
23 if( oldim->kind == datum ){
24 newim = mri_copy(oldim) ; RETURN(newim) ; /* 10 Dec 2008 */
25 }
26
27 if( oldim->kind == MRI_fvect ){ /* 10 Dec 2008 */
28 MRI_IMAGE *qim = mri_fvect_subimage(oldim,0) ;
29 if( datum == MRI_float ){
30 newim = qim ;
31 } else {
32 newim = mri_to_mri(datum,qim) ; mri_free(qim) ;
33 }
34 RETURN(newim) ;
35 }
36
37 /*-- return to the normal conversion cases --*/
38
39 switch( datum ){
40 default:
41 fprintf(stderr,
42 "\nUnsupported mri_to_mri conversion!\a\n") ;
43 newim = NULL ;
44 break ;
45
46 case MRI_short:{
47 double imtop ;
48 imtop = mri_maxabs( oldim ) ;
49
50 if( imtop <= 32767.0 )
51 newim = mri_to_short( 1.0 , oldim ) ;
52 else
53 newim = mri_to_short_scl( 0.0 , 10000.0 , oldim ) ;
54 }
55 break ;
56
57 case MRI_float:
58 newim = mri_to_float( oldim ) ;
59 break ;
60
61 case MRI_byte:{
62 float immin , immax ;
63
64 if( oldim->kind == MRI_byte ){
65 newim = mri_to_byte( oldim ) ;
66 } else {
67 immin = mri_min( oldim ) ; immax = mri_max( oldim ) ;
68 if( immin >= 0 && immax < 256 )
69 newim = mri_to_byte_scl( 1.0 , 0.0 , oldim ) ;
70 else
71 newim = mri_to_byte_scl( 0.0 , 255.0 , oldim ) ;
72 }
73 }
74 break ;
75
76 case MRI_complex:
77 newim = mri_to_complex( oldim ) ;
78 break ;
79
80 case MRI_rgb:
81 newim = mri_to_rgb( oldim ) ; /* 11 Feb 1999 */
82 break ;
83
84 case MRI_rgba:
85 newim = mri_to_rgba( oldim ) ; /* 20 Mar 2002 */
86 break ;
87
88 }
89 RETURN( newim );
90 }
91
92 /*-----------------------------------------------------
93 Convert input image to the type given by "datum",
94 scaled by the given factor.
95 -------------------------------------------------------*/
96
mri_to_mri_scl(int datum,double factor,MRI_IMAGE * oldim)97 MRI_IMAGE * mri_to_mri_scl( int datum , double factor , MRI_IMAGE * oldim )
98 {
99 MRI_IMAGE * newim ;
100
101 ENTRY("mri_to_mri_scl") ;
102
103 if( oldim == NULL ) RETURN( NULL ); /* 09 Feb 1999 */
104
105 switch( datum ){
106 default:
107 fprintf(stderr,
108 "\nUnsupported mri_to_mri conversion!\a\n") ;
109 newim = NULL ;
110 break ;
111
112 case MRI_short:
113 newim = mri_to_short( factor , oldim ) ;
114 break ;
115
116 case MRI_float:
117 newim = mri_scale_to_float( factor , oldim ) ;
118 break ;
119
120 case MRI_byte:
121 newim = mri_to_byte_scl( factor , 0.0 , oldim ) ;
122 break ;
123
124 case MRI_complex:{
125 complex * cxar ; int ii , nvox ;
126 newim = mri_to_complex( oldim ) ;
127 cxar = MRI_COMPLEX_PTR(newim) ;
128 nvox = newim->nvox ;
129 for( ii=0 ; ii < nvox ; ii++ ){
130 cxar[ii].r *= factor ; cxar[ii].i *= factor ;
131 }
132 }
133 break ;
134 }
135 RETURN( newim );
136 }
137