【问题标题】:Inverting alpha of BufferedImage反转 BufferedImage 的 alpha
【发布时间】:2014-02-16 03:49:06
【问题描述】:

我正在尝试反转缓冲图像的 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;
}

【问题讨论】:

    标签: java graphics colors bufferedimage


    【解决方案1】:
    return A | R | G |B;
    

    ARGB 都是字节,因此将它们“或”运算在一起的结果是一个字节,然后将其符号扩展为一个整数。您必须使用 shift 和 ors 来重建 int ARGB 值,与将它分开的方式相反。

    就您的代码而言,最终结果很可能如下所示:

    0xffffff??
    

    ?? 是值的“或”。 IE。它将是全强度的红色+绿色(黄色),蓝色通道略有变化,但可能大多数位也打开了。

    你想要的是

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

    此外,从输出中,我怀疑您的图像类型是 TYPE_INT_ARGB 而不是 TYPE_4BYTE_ABGR

    【讨论】:

      猜你喜欢
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      相关资源
      最近更新 更多