1

我正在尝试将彩色 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;
}

, r,数组是 RGB 颜色分量gb我将它们放在char *r,*g,*b.

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

  1. 是由于计算lum的数据丢失还是将int存储为char有什么问题?
  2. 灰度bmp可以不是24位吗?还是我在转换后存储 rgb 值的方式有问题?

对此的任何帮助将不胜感激。谢谢。

4

2 回答 2

6

这些真的应该是unsigned char;如果char碰巧在您的平台上签名,那么此代码将不会达到您的预期。

于 2010-11-10T18:20:32.963 回答
2

您需要将计算的输出限制在 [0,255] 中。你的计算看起来不错,但确定总是好的。

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

于 2010-11-10T18:20:33.930 回答