00090 {
00091
00092 QImage*
editedImage =
new QImage( filename );
00093
00094
00095
if(
editedImage->depth() < 32 )
00096 {
00097 QImage* tmp =
editedImage;
00098
editedImage =
new QImage( tmp->convertDepth( 32, Qt::AutoColor ) );
00099
delete tmp; tmp=NULL;
00100 }
00101
00102
00103 QString statusMessage = qApp->translate(
"improveColorBalance",
"Enhancing Color Balance:" );
00104
status->
showProgressBar( statusMessage, 100 );
00105 qApp->processEvents();
00106
00107
00108
const int updateIncrement = (
int) ( 0.01 *
editedImage->width() *
editedImage->height() );
00109
int newProgress = 0;
00110
00111
00112
int redVals[256];
00113
int greenVals[256];
00114
int blueVals[256];
00115
int i=0;
00116
for(i=0; i<256; i++)
00117 {
00118 redVals[i] = 0;
00119 greenVals[i] = 0;
00120 blueVals[i] = 0;
00121 }
00122
00123
00124
int numPixels =
editedImage->width()*
editedImage->height();
00125 QRgb* rgb;
00126 uchar* scanLine;
00127
int x, y;
00128
for( y=0; y<
editedImage->height(); y++)
00129 {
00130
00131 scanLine =
editedImage->scanLine(y);
00132
for( x=0; x<
editedImage->width(); x++)
00133 {
00134 rgb = ((QRgb*)scanLine+x);
00135 redVals[qRed(*rgb)]++;
00136 greenVals[qGreen(*rgb)]++;
00137 blueVals[qBlue(*rgb)]++;
00138 }
00139 }
00140
00141
00142
00143
int sumR=0;
00144
int sumG=0;
00145
int sumB=0;
00146
int indexLowR, indexHighR;
00147
int indexLowG, indexHighG;
00148
int indexLowB, indexHighB;
00149 indexLowR = -1; indexHighR = -1;
00150 indexLowG = -1; indexHighG = -1;
00151 indexLowB = -1; indexHighB = -1;
00152
for(i=0; i<256; i++)
00153 {
00154 sumR+=redVals[i];
00155 sumG+=greenVals[i];
00156 sumB+=blueVals[i];
00157
00158
00159
if(indexLowR < 0 && sumR >= 0.01*numPixels)
00160 { indexLowR = i; }
00161
if(indexLowG < 0 && sumG >= 0.01*numPixels)
00162 { indexLowG = i; }
00163
if(indexLowB < 0 && sumB >= 0.01*numPixels)
00164 { indexLowB = i; }
00165
00166
00167
if(indexHighR < 0 && sumR >= 0.99*numPixels)
00168 { indexHighR = i; }
00169
if(indexHighG < 0 && sumG >= 0.99*numPixels)
00170 { indexHighG = i; }
00171
if(indexHighB < 0 && sumB >= 0.99*numPixels)
00172 { indexHighB = i; }
00173 }
00174
00175
00176
for( y=0; y<
editedImage->height(); y++)
00177 {
00178
00179 scanLine =
editedImage->scanLine(y);
00180
for( x=0; x<
editedImage->width(); x++)
00181 {
00182
00183 rgb = ((QRgb*)scanLine+x);
00184
double r = ((
double)qRed(*rgb) );
00185
double g = ((
double)qGreen(*rgb) );
00186
double b = ((
double)qBlue(*rgb) );
00187
00188
if(indexHighR != indexLowR) { r = (255*(r-indexLowR))/(indexHighR-indexLowR); }
00189
if(indexHighG != indexLowG) { g = (255*(g-indexLowG))/(indexHighG-indexLowG); }
00190
if(indexHighB != indexLowB) {
b = (255*(
b-indexLowB))/(indexHighB-indexLowB); }
00191
00192
int rp = (
int) QMIN( QMAX(r, 0), 255 );
00193
int gp = (
int) QMIN( QMAX(g, 0), 255 );
00194
int bp = (
int) QMIN( QMAX(b, 0), 255 );
00195
00196
00197 *rgb = qRgb(rp,gp,bp);
00198
00199
00200
newProgress++;
00201
if(
newProgress >=
updateIncrement)
00202 {
00203
newProgress = 0;
00204
status->
incrementProgress();
00205 qApp->processEvents();
00206 }
00207
00208 }
00209 }
00210
00211
00212
status->
setStatus(
"" );
00213 qApp->processEvents();
00214
00215
00216
return editedImage;
00217 }