将颜色bmp转换为灰度bmp?

时间:2010-11-10 18:16:03

标签: c++ c bmp

我正在尝试将彩色BMP文件转换为灰度BMP。输入bmp是24位,我在输出端产生相同的24位bmp,这次只是灰度级。

我正在使用的代码是

for(int x = 0; x < max; x++)
{
    int lum;
    lum = (r[x]*0.30) + (g[x]*0.59) + (b[x]*0.11);
    r[x] = lum;
    g[x] = lum;
    b[x] = lum;
}

rgb数组是RGB颜色组件,我将它们放在char *r,*g,*b中。

由于某些原因,我没有得到干净的输出。我正在附加我对这个问题的输出,它的斑驳并且在地方包含白色和黑色区域。那么我在这里做错了什么?

  1. 是因为计算lum时数据丢失还是将int存储为char有什么问题?
  2. 灰阶bmp不能24位吗?或者我在转换后存储rgb值的方式有问题吗?
  3. 任何有关这方面的帮助都会受到很多关注。感谢。

2 个答案:

答案 0 :(得分:6)

这些应该是unsigned char;如果恰好在您的平台上签署char,那么此代码将无法满足您的期望。

答案 1 :(得分:2)

您需要将计算的输出钳位在[0,255]中。你的计算看起来没问题,但确定总是好的。

还要确保r,g,b数组为unsigned char。你可以在int中使用大量的有符号/无符号混合(由于2的补码溢出覆盖了错误)但是当你转换为float时,符号必须是正确的。