使用BufferedImage的DataBuffer设置像素
问题描述:
我试图使用类型TYPE_3BYTE_BGR
的BufferedImage
的底层DataBufferByte
尽可能快地设置像素值。使用BufferedImage的DataBuffer设置像素
也许我不理解,但是当我做了以下...
byte[] imgBytes = ((DataBufferByte) img.getData().getDataBuffer()).getData();
...它好像我收到的byte [],而不是一个引用的副本。例如,如果我跑......
System.out.println(System.identityHashCode(imgBytes));
System.out.println(System.identityHashCode((DataBufferByte) img.getData().getDataBuffer()).getData());
...我得到两个明显不同对象的哈希值。如果我没有弄错,这表明我没有得到底层字节[]的引用,而是一个副本。如果是这种情况,我该如何直接编辑0???
或者我只是设置错误的像素...当我在imgBytes中设置像素时,它似乎没有对BufferedImage执行任何操作。一旦我得到的byte [],我设定每个像素值,像这样:
imgBytes[intOffset] = byteBlue;
imgBytes[intOffset+1] = byteGreen;
imgBytes[intOffset+2] = byteRed;
对我来说,这一切似乎罚款。我可以用这种方式读取像素,所以看起来我应该可以用相同的方式写出它们!
答
我曾经玩过Java中图像的像素操作。不要直接回答你的问题,我会为你的问题提供一个替代解决方案。你可以做到以下几点,以创建像素阵列来操作:
final int width = 800;
final int height = 600;
final int[] pixels = new int[width * height]; // 0xAARRGGBB
MemoryImageSource source = new MemoryImageSource(width, height, pixels, 0, width);
source.setAnimated(true);
source.setFullBufferUpdates(true);
Image image = Toolkit.getDefaultToolkit().createImage(source);
image.setAccelerationPriority(1f);
然后绘制图像,你可以简单地调用从Graphics类的drawImage方法。
还有其他一些方法可以实现您要查找的内容,但这种方法对我来说最简单。
答
下面是它在JDK7中的实现方式。如果这些东西不适合你,你可能会在其他地方发生错误。
public byte[] getData() {
theTrackable.setUntrackable();
return data;
}
答
我有同样的问题。你可能不使用getData(),而是使用getRaster(),它给你一个你可以用来写入的数组。
为了更快提供更好的帮助,请发布[SSCCE](http://sscce.org/)。热链接到一个小的(以字节为单位)的图像或在代码中生成一个。 –