如何将特定值设置为java中的任何像素?

时间:2012-02-02 17:50:21

标签: java pixel grayscale

实际上我正在做一些图像处理项目并且在某个地方受到了打击。我必须将彩色图像转换为灰度,为此我使用了 RED GREEN BLUE 组件的值来提取GETRGB() n现在我想将该像素的 RGB 值设置为等于 RGB 组件的平均值。 RGB 组件分别存储在INT变量中,因此您可以帮我将此 RGB 组件的平均值设置为原始像素值吗? 代码的一部分是:

           rgbArray=new int[w*h];
           buffer.getRGB(0, 0, width, height, rgbArray , 0,width );
           int a,r,g,b; 
           for(int i = 0 ; i<w*h; i++)
            { 
              r = (0x00ff0000 & rgbArray[i]) >> 16;
              g = (0x0000ff00 & rgbArray[i]) >> 8;
              b = (0x000000ff & rgbArray[i]);
              rgbArray[i] = (r+g+b)/3;
            }
           buffer.setRGB(0, 0, width, height, rgbArray , 0,width);

但这不是给我一个灰色的图像。你能说出我在做错了吗?

2 个答案:

答案 0 :(得分:0)

目前尚不清楚自己想做什么。如果您尝试生成灰色,我建议参考以下页面:http://www.tayloredmktg.com/rgb/显示不同灰度的rgb代码。

如果您想要获得半透明图像,则必须在java中使用Alpha通道(RGBA命令)。您还可以通过特殊方式将基础图像与当前图像合成来获得半透明效果,但这比使用Alpha通道要困难得多。

答案 1 :(得分:0)

您的代码不会将灰度级别打包回每个颜色分量。另外,正如我在对该问题的评论中所说,转换为灰度需要考虑人眼对每种颜色成分的敏感度。获得灰度级的典型公式是

G = 0.30 * R + 0.59 * G + 0.11 * B

this Wikipedia article个州。

因此,您的for循环应如下所示:

for(int i = 0 ; i<w*h; i++)
{
    a = (0xff000000 & rgbArray[i]);
    r = (0x00ff0000 & rgbArray[i]) >> 16;
    g = (0x0000ff00 & rgbArray[i]) >> 8;
    b = (0x000000ff & rgbArray[i]);
    int gray = (int)(0.30 * r + 0.59 * g + 0.11 * b);
    if ( gray < 0 ) gray = 0;
    if ( gray > 255 ) gray = 255;
    rgbArray[i] = a | ( gray << 16 ) | ( gray << 8 ) | gray;
}

当然,您可以在循环之外声明gray,就像使用r一样。