开发者

adjust bitmap image brightness/contrast using c++

adjust image brightness/contrast using c++ without usin开发者_如何学运维g any other 3rd party library or dependancy


Image brightness is here - use the mean of the RGB values and shift them.

Contrast is here with other languages solutions available as well.


Edit in case the above links die:

The answer given by Jerry Coffin below covers the same topic and has links that still live.

But, to adjust brightness, you add a constant value to each for the R,G,B fields of an image. Make sure to use saturated math - don't allow values to go below 0 or above the maximum allowed in your bit-depth (8-bits for 24-bit color)

RGB_struct color = GetPixelColor(x, y);
size_t newRed   = truncate(color.red   + brightAdjust);
size_t newGreen = truncate(color.green + brightAdjust);
size_t newBlue  = truncate(color.blue  + brightAdjust);

For contrast, I have taken and slightly modified code from this website:

float factor = (259.0 * (contrast + 255.0)) / (255.0 * (259.0 - contrast));
RGB_struct color = GetPixelColor(x, y);
size_t newRed   = truncate((size_t)(factor * (color.red   - 128) + 128));
size_t newGreen = truncate((size_t)(factor * (color.green - 128) + 128));
size_t newBlue  = truncate((size_t)(factor * (color.blue  - 128) + 128));

Where truncate(int value) makes sure the value stays between 0 and 255 for 8-bit color. Note that many CPUs have intrinsic functions to do this in a single cycle.

size_t truncate(size_t value)
{
    if(value < 0) return 0;
    if(value > 255) return 255;

    return value;
}


Read in the image with a library just as the Independent JPEG library. When you have raw data, you can convert it from RGB to HSL or (preferably) CIE Lab*. Both contrast and brightness will basically just involve adjustments to the L channel -- to adjust brightness, just adjust all the L values up or down by an appropriate amount. To adjust contrast, you basically adjust the difference between a particular value and the center value. You'll generally want to do this non-linearly, so values near the middle of the range are adjusted quite a bit, but values close to the ends or the range aren't affected nearly as much (and any that are at the very ends, aren't changed at all).

Once you've done that, you can convert back to RGB, and then back to a normal format such as JPEG.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜