0

我有一种情况需要反转 a 的 Alpha 通道VolatileImage

我目前的实现很明显,但很慢;

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 & 0xfffor 0 <= x < 256,我能不能以某种方式在 alpha 通道上进行整体异或?

4

2 回答 2

2

经过大量的谷歌搜索,我遇到了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 倍。

于 2013-05-31T13:27:08.303 回答
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);
    }
}
于 2013-05-31T13:05:15.277 回答