|
Hi all!
IMHO the white balance tool is quite useless in its current form because it overexposes and clips at least one of the rgb components almost always. The exposure compensation thing does not help because it is applied on the already clipped image. I wrote the simple patch below that makes the wb tool useable by scaling down the wb multipiers just enough to prevent clipping. The biggest problem is that the final result can be quite a lot dimmer than the preview image because the scaler smooths the (usually tiny) brightest spots of the photo. --- digikam-1.6.0/libs/dimg/filters/wb/wbfilter.cpp__orig 2010-11-22 18:47:36.000000000 +0100 +++ digikam-1.6.0/libs/dimg/filters/wb/wbfilter.cpp 2010-12-06 22:37:29.000000000 +0100 @@ -294,6 +294,38 @@ void WBFilter::adjustWhiteBalance(uchar* uchar red, green, blue; uchar* ptr = data; + + int maxr, maxg, maxb, max; + double adjust; + + // Look for the maximum r, g, b values in the given image + maxr = maxg = maxb = 0; + for (j = 0 ; j < size; ++j) { + if (maxb < ptr[0]) maxb = ptr[0]; + if (maxg < ptr[1]) maxg = ptr[1]; + if (maxr < ptr[2]) maxr = ptr[2]; + ptr += 4; + } +printf("maxrgb=%d, %d, %d\n", maxr, maxg, maxb); +printf("mrgb=%f, %f, %f\n", d->mr, d->mg, d->mb); + // White balance them and find the most overexposed one + maxr *= d->mr; + maxg *= d->mg; + maxb *= d->mb; + max = qMax(maxb, maxg); + max = qMax(max, maxr); +printf("m*maxrgb=%d, %d, %d m*max=%d clamp_at=%d\n", maxr, maxg, maxb, max, d->rgbMax-1); + // Scale wb coefficients down if needed + if (max > d->rgbMax-1) { + adjust = (double)(d->rgbMax-1) / max; +printf("adjust=%f\n", adjust); + d->mb = d->mb * adjust; // Overwrites d->mx !! + d->mg = d->mg * adjust; + d->mr = d->mr * adjust; + } + ptr = data; + + for (j = 0 ; runningFlag() && (j < size) ; ++j) { int v, rv[3]; -- Giuliano. _______________________________________________ Digikam-devel mailing list [hidden email] https://mail.kde.org/mailman/listinfo/digikam-devel |
|
Thanks Giuliano for you patch.
Please file a bug in KDE bugzilla system and attach your patch. We will review later. Look here for details : http://www.digikam.org/drupal/contrib It's always better to use bugzilla instead to post on maillist. We use Bugzilla file ID for AQ stuff. It's the real story of the project. It's difficult to link source code to a mailing list post. Also, take a care to use code from svn trunk to create patch. Thanks in advance Gilles Caulier 2010/12/6 Giuliano Pochini <[hidden email]>: > Hi all! > > IMHO the white balance tool is quite useless in its current form because it > overexposes and clips at least one of the rgb components almost always. The > exposure compensation thing does not help because it is applied on the > already clipped image. I wrote the simple patch below that makes the wb > tool useable by scaling down the wb multipiers just enough to prevent > clipping. > > The biggest problem is that the final result can be quite a lot dimmer than > the preview image because the scaler smooths the (usually tiny) brightest > spots of the photo. > > > > --- digikam-1.6.0/libs/dimg/filters/wb/wbfilter.cpp__orig 2010-11-22 18:47:36.000000000 +0100 > +++ digikam-1.6.0/libs/dimg/filters/wb/wbfilter.cpp 2010-12-06 22:37:29.000000000 +0100 > @@ -294,6 +294,38 @@ void WBFilter::adjustWhiteBalance(uchar* > uchar red, green, blue; > uchar* ptr = data; > > + > + int maxr, maxg, maxb, max; > + double adjust; > + > + // Look for the maximum r, g, b values in the given image > + maxr = maxg = maxb = 0; > + for (j = 0 ; j < size; ++j) { > + if (maxb < ptr[0]) maxb = ptr[0]; > + if (maxg < ptr[1]) maxg = ptr[1]; > + if (maxr < ptr[2]) maxr = ptr[2]; > + ptr += 4; > + } > +printf("maxrgb=%d, %d, %d\n", maxr, maxg, maxb); > +printf("mrgb=%f, %f, %f\n", d->mr, d->mg, d->mb); > + // White balance them and find the most overexposed one > + maxr *= d->mr; > + maxg *= d->mg; > + maxb *= d->mb; > + max = qMax(maxb, maxg); > + max = qMax(max, maxr); > +printf("m*maxrgb=%d, %d, %d m*max=%d clamp_at=%d\n", maxr, maxg, maxb, max, d->rgbMax-1); > + // Scale wb coefficients down if needed > + if (max > d->rgbMax-1) { > + adjust = (double)(d->rgbMax-1) / max; > +printf("adjust=%f\n", adjust); > + d->mb = d->mb * adjust; // Overwrites d->mx !! > + d->mg = d->mg * adjust; > + d->mr = d->mr * adjust; > + } > + ptr = data; > + > + > for (j = 0 ; runningFlag() && (j < size) ; ++j) > { > int v, rv[3]; > > > > > -- > Giuliano. > _______________________________________________ > Digikam-devel mailing list > [hidden email] > https://mail.kde.org/mailman/listinfo/digikam-devel > Digikam-devel mailing list [hidden email] https://mail.kde.org/mailman/listinfo/digikam-devel |
|
On Tue, 7 Dec 2010 09:04:02 +0100
Gilles Caulier <[hidden email]> wrote: > Thanks Giuliano for you patch. > > Please file a bug in KDE bugzilla system and attach your patch. We > will review later. Look here for details : > > http://www.digikam.org/drupal/contrib > > It's always better to use bugzilla instead to post on maillist. We use > Bugzilla file ID for AQ stuff. It's the real story of the project. > It's difficult to link source code to a mailing list post. > > Also, take a care to use code from svn trunk to create patch. Done, thanks. -- Giuliano. _______________________________________________ Digikam-devel mailing list [hidden email] https://mail.kde.org/mailman/listinfo/digikam-devel |
| Free forum by Nabble | Edit this page |
