4
* 2001-September-20 Jason Rohrer
6
* Changed so that images are normalized to [0,1] before
10
#include "minorGems/graphics/Image.h"
11
#include "minorGems/graphics/ImageColorConverter.h"
13
#include "minorGems/graphics/converters/BMPImageConverter.h"
15
#include "minorGems/io/file/File.h"
16
#include "minorGems/io/file/FileInputStream.h"
17
#include "minorGems/io/file/FileOutputStream.h"
23
void usage( char *inAppName );
24
Image *loadBMPImage( char *inFileName );
25
void writeBMPImage( char *inFileName, Image *inImage );
26
// normalizes an image into the pixel range [0,1] if some
27
// pixels are out of range
28
void normalizeImage( Image *inImage );
31
// a test program that converts an rgb BMP to a yiq BMP
32
int main( char inNumArgs, char **inArgs ) {
34
if( inNumArgs != 3 ) {
38
Image *yiqImage = loadBMPImage( inArgs[1] );
40
if( yiqImage == NULL ) {
41
printf( "Reading image from file %s failed\n", inArgs[1] );
45
Image *rgbImage = ImageColorConverter::YIQToRGB( yiqImage );
47
normalizeImage( rgbImage );
49
writeBMPImage( inArgs[2], rgbImage );
58
void usage( char *inAppName ) {
60
printf( "\t%s yiq_image_bmp rgb_image_bmp\n", inAppName );
61
printf( "Example:\n" );
62
printf( "\t%s testYIQ.bmp testRGB.bmp\n", inAppName );
69
void normalizeImage( Image *inImage ) {
70
// now normalize the image so that pixels are in the range [0,1]
72
int numPixels = inImage->getWidth() * inImage->getHeight();
73
int numChannels = inImage->getNumChannels();
74
double minValue = 1000.0;
75
double maxValue = -1000.0;
78
// search for min and max values
79
for( c=0; c<numChannels; c++ ) {
80
double *channel = inImage->getChannel( c );
81
for( int p=0; p<numPixels; p++ ) {
82
if( channel[p] < minValue ) {
83
minValue = channel[p];
85
else if( channel[p] > maxValue ) {
86
maxValue = channel[p];
91
double diff = maxValue - minValue;
93
if( minValue >= 0 && diff + minValue <= 1 ) {
94
// no need to normalize, as values are already
99
double scale = 1.0 / diff;
101
// now normalize all pixels
102
for( c=0; c<numChannels; c++ ) {
103
double *channel = inImage->getChannel( c );
104
for( int p=0; p<numPixels; p++ ) {
105
channel[p] = ( channel[p] - minValue ) * scale;
112
Image *loadBMPImage( char *inFileName ) {
113
File *imageFile = new File( NULL, inFileName,
114
strlen( inFileName ) );
115
FileInputStream *imageStream
116
= new FileInputStream( imageFile );
118
BMPImageConverter *converter = new BMPImageConverter();
120
Image *returnImage = converter->deformatImage( imageStream );
131
void writeBMPImage( char *inFileName, Image *inImage ) {
132
File *imageFile = new File( NULL, inFileName,
133
strlen( inFileName ) );
134
FileOutputStream *imageStream
135
= new FileOutputStream( imageFile );
137
BMPImageConverter *converter = new BMPImageConverter();
139
converter->formatImage( inImage, imageStream );