2014-01-25 74 views
1

我想反轉bufferedimage的alpha,但不是反轉alpha,而是返回一個奇怪的黃色圖像。BufferedImage的反向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; 
} 

回答

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

+0

非常感謝! – Kyranstar