/*****************************************************************************
Major portions of this software are copyrighted by the Medical College
of Wisconsin, 1994-2000, and are released under the Gnu General Public
License, Version 2. See the file README.Copyright for details.
******************************************************************************/
#include "mrilib.h"
/*** 7D SAFE ***/
MRI_IMAGE *mri_to_byte( MRI_IMAGE *oldim )
{
MRI_IMAGE *newim ;
register int ii , npix ;
double imin,imax ;
register double scale ;
short shbot ;
int inbot ;
float flbot ;
double dbbot ;
byte *ar ;
ENTRY("mri_to_byte") ;
if( oldim == NULL ) RETURN( NULL ); /* 09 Feb 1999 */
newim = mri_new_conforming( oldim , MRI_byte ) ;
npix = oldim->nvox ;
switch( oldim->kind ){
case MRI_short:
case MRI_int:
case MRI_float:
case MRI_double:
imin = mri_min( oldim ) ;
imax = mri_max( oldim ) ;
imax = (imax <= imin) ? imin+1 : imax ;
scale = 255.9 / (imax-imin) ;
switch( oldim->kind ){
case MRI_short: shbot = imin ; break ;
case MRI_int: inbot = imin ; break ;
case MRI_float: flbot = imin ; break ;
case MRI_double: dbbot = imin ; break ;
}
break ;
case MRI_complex:
scale = 255.9 / mri_max( oldim ) ;
break ;
}
ar = MRI_BYTE_PTR( newim ) ; /* fast access to data */
switch( oldim->kind ){
case MRI_byte:
(void) memcpy( ar , MRI_BYTE_PTR(oldim) , sizeof(byte)*npix ) ;
break ;
case MRI_rgb:{ /* 13 Nov 2002 */
byte *rgb = MRI_RGB_PTR(oldim) ;
float rfac=0.299*scale , gfac=0.587*scale , bfac=0.114*scale , val ;
for( ii=0 ; ii < npix ; ii++ ){
val = rfac * rgb[3*ii] + gfac * rgb[3*ii+1] + bfac * rgb[3*ii+2] ;
ar[ii] = BYTEIZE(val) ;
}
}
break ;
case MRI_short:{
short *qar = MRI_SHORT_PTR(oldim) ;
for( ii=0 ; ii < npix ; ii++ ) ar[ii] = scale * (qar[ii]-shbot) ;
}
break ;
case MRI_int:{
int *qar = MRI_INT_PTR(oldim) ;
for( ii=0 ; ii < npix ; ii++ ) ar[ii] = scale * (qar[ii]-inbot) ;
}
break ;
case MRI_float:{
float *qar = MRI_FLOAT_PTR(oldim) ;
for( ii=0 ; ii < npix ; ii++ ) ar[ii] = scale * (qar[ii]-flbot) ;
}
break ;
case MRI_double:{
double *qar = MRI_DOUBLE_PTR(oldim) ;
for( ii=0 ; ii < npix ; ii++ ) ar[ii] = scale * (qar[ii]-dbbot) ;
}
break ;
case MRI_complex:{
complex *qar = MRI_COMPLEX_PTR(oldim) ;
for( ii=0 ; ii < npix ; ii++ ) ar[ii] = scale * CABS(qar[ii]) ;
}
break ;
default:
fprintf( stderr , "mri_to_byte: unrecognized image kind\n" ) ;
MRI_FATAL_ERROR ;
}
MRI_COPY_AUX(newim,oldim) ;
RETURN( newim );
}
/*----------------------------------------------------------------------------*/
MRI_IMAGE *mri_to_byte_scl( double scl , double lev , MRI_IMAGE *oldim )
{
MRI_IMAGE *newim ;
register int ii , npix ;
double imin,imax ;
register double dscale , dbbot ;
register float scale , flbot , val ;
register byte *ar ;
ENTRY("mri_to_byte_scl") ;
if( oldim == NULL ) RETURN( NULL ); /* 09 Feb 1999 */
newim = mri_new_conforming( oldim , MRI_byte ) ;
npix = oldim->nvox ;
if( scl == 0 ){ /* compute scaling to make (min..max) -> (0..lev) */
imin = (oldim->kind == MRI_complex) ? (0) : mri_min( oldim ) ;
imax = mri_max( oldim ) ;
imax = (imax <= imin) ? imin+1 : imax ;
scale = dscale = (lev+0.99) / (imax-imin) ;
flbot = dbbot = imin ;
} else { /* user controlled scaling, with lev -> 0 */
scale = dscale = scl ;
flbot = dbbot = lev ;
}
ar = MRI_BYTE_PTR( newim ) ; /* fast access to data */
switch( oldim->kind ){
case MRI_byte:{
byte *qar = MRI_BYTE_PTR(oldim) ;
for( ii=0 ; ii < npix ; ii++ ){
val = scale * (qar[ii]-flbot) ; ar[ii] = BYTEIZE(val) ;
}
}
break ;
case MRI_short:{
short *qar = MRI_SHORT_PTR(oldim) ;
for( ii=0 ; ii < npix ; ii++ ){
val = scale * (qar[ii]-flbot) ; ar[ii] = BYTEIZE(val) ;
}
}
break ;
case MRI_int:{
int *qar = MRI_INT_PTR(oldim) ;
for( ii=0 ; ii < npix ; ii++ ){
val = scale * (qar[ii]-flbot) ; ar[ii] = BYTEIZE(val) ;
}
}
break ;
case MRI_float:{
float *qar = MRI_FLOAT_PTR(oldim) ;
for( ii=0 ; ii < npix ; ii++ ){
val = scale * (qar[ii]-flbot) ; ar[ii] = BYTEIZE(val) ;
}
}
break ;
case MRI_double:{
double *qar = MRI_DOUBLE_PTR(oldim) ;
for( ii=0 ; ii < npix ; ii++ ) ar[ii] = dscale * (qar[ii]-dbbot) ;
}
break ;
case MRI_complex:{
complex *qar = MRI_COMPLEX_PTR(oldim) ;
for( ii=0 ; ii < npix ; ii++ ) ar[ii] = scale * CABS(qar[ii]) ;
}
break ;
default:
fprintf( stderr , "mri_to_byte_scl: unrecognized image kind\n" ) ;
MRI_FATAL_ERROR ;
}
MRI_COPY_AUX(newim,oldim) ;
RETURN( newim );
}
syntax highlighted by Code2HTML, v. 0.9.1