Java反转图像Alpha

时间:2013-05-31 13:00:28

标签: java image alpha-transparency

我遇到需要反转VolatileImage

的alpha通道的情况

我目前的实施是显而易见的,但非常缓慢;

public BufferedImage invertImage(VolatileImage v) {
    BufferedImage b = new BufferedImage(v.getWidth(), v.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
    Graphics g = b.getGraphics();
    g.drawImage(v, 0, 0, null);
    for(int i = 0; i < b.getWidth(); i++) {
        for(int(j = 0; j < b.getHeight(); j++) {
            Color c = new Color(b.getRGB(i, j, true));
            c = new Color(c.getRed(), c.getGreen(), c.getBlue(), 255 - c.getAlpha());
            b.setRGB(i, j, c.getRGB());
        }
    }
    return b;
}

这很好用,但速度很慢。我有大图像,需要快速。我已经弄乱了AlphaComposite,但无济于事 - 据我所知,这不是一个堆肥问题。

鉴于255 - x相当于x & 0xff的{​​{1}},我不能以某种方式对alpha通道进行集体XOR吗?

2 个答案:

答案 0 :(得分:2)

经过大量的googleing后,我发现DataBuffer个类被用作BufferedImages的地图:

DataBufferByte buf = (DataBufferByte)b.getRaster().getDataBuffer();
byte[] values = buf.getData();
for(int i = 0; i < values.length; i += 4) values[i] = (byte)(values[i] ^ 0xff);

这会反转BufferedImage的值(您不需要将其绘制回来,更改数组值会改变缓冲的图像本身)。

我的测试显示这种方法比jazzbassrob的改进速度快20倍,这比我原来的方法快了约1.5倍。

答案 1 :(得分:1)

你应该能够通过避免循环中的所有getter和构造函数来加速它:

for(int i = 0; i < b.getWidth(); i++) {
    for(int(j = 0; j < b.getHeight(); j++) {
        b.setRGB(b.getRGB(i, j) ^ 0xFF000000);
    }
}