反转BufferedImage的alpha

时间:2014-01-25 00:05:38

标签: java graphics colors bufferedimage

我正在尝试反转bufferedimage的alpha,但不是反转alpha,而是返回一个奇怪的黄色图像。

这是反转之前的原始original

这是它返回的内容:return

public void invertAlpha(BufferedImage lightmap){    
    int[] values = (int[])lightmap.getRaster().getDataElements(0, 0, lightmap.getWidth(), lightmap.getHeight(), null);
    for(int i = 0; i < values.length; i += 1) values[i] = (byte)(invertAlphaofPixel(values[i]));

    lightmap.getRaster().setDataElements(0, 0, lightmap.getWidth(), lightmap.getHeight(), values);
}
public int invertAlphaofPixel(int value){

    byte R = (byte) (value & 255); 
    byte G = (byte) ((value >> 8) & 255); 
    byte B = (byte) ((value >> 16) & 255); 
    byte A = (byte) ((value >> 24) & 255);
    A = (byte) (A ^ 0xff); //basically A = 255 - A I believe?

    return A | R | G |B;
}

1 个答案:

答案 0 :(得分:3)

return A | R | G |B;

ARGB都是字节,因此'或'将它们放在一起的结果是一个字节,然后得到符号 - 扩展为int。你必须重新调整int ARGB值,与你将它分开的方式相反,包括shift和ors。

正如您的代码所代表的那样,最终结果很可能如下所示:

0xffffff??

其中??是值的“或”。即它将是全强度的红色+绿色(黄色),蓝色通道有一点变化,但也可能是大多数位。

你想要的是

return ((int)A)<<24 | 
        0x00FF0000 & ((int)B)<<16 | 
        0x0000FF00 & ((int)G)<<8  | 
        0x000000FF & ((int)R);

另外,从输出中,我怀疑您的图片是TYPE_INT_ARGB而不是TYPE_4BYTE_ABGR