2010-11-10 152 views
1

我想将彩色BMP文件转换为灰度BMP。输入bmp是24位,我在输出端产生相同的24位bmp,只有这次是灰度级的。将彩色bmp转换为灰度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值的方式有问题?

在这方面的任何帮助将大大appriciated。谢谢。

+0

你可以添加你的代码?如何将图像加载到矩阵中并执行此过程并保存它?谢谢! – 2013-05-10 14:18:03

回答

6

这些应该确实是unsigned char;如果char恰好在您的平台上签名,那么此代码将无法达到您的期望。

+0

非常感谢您的回答。有效。 – 2010-11-10 19:06:01

2

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

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

+0

在这种情况下夹紧应该是不必要的。即使所有三个分量都是满量程,总和也不应该大于满量程(+由于浮点表示而导致的分数误差)。转换回int总是截断为零。 – 2010-11-10 18:23:23

+0

非常感谢。我不需要夹紧装置,但使RGB RGB通道工作得很好!非常感谢。 – 2010-11-10 18:35:35