我遇到需要反转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 & 0xff
的{{1}},我不能以某种方式对alpha通道进行集体XOR吗?
答案 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);
}
}