我正在尝试反转bufferedimage的alpha,但不是反转alpha,而是返回一个奇怪的黄色图像。
这是反转之前的原始
这是它返回的内容:
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;
}
答案 0 :(得分:3)
return A | R | G |B;
值A
,R
,G
和B
都是字节,因此'或'将它们放在一起的结果是一个字节,然后得到符号 - 扩展为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
。