我正在尝试使用类型为DataBufferByte
的{{1}}的基础BufferedImage
来尽可能快地设置像素值。
也许我不理解,但是当我做以下事情时......
TYPE_3BYTE_BGR
...好像我得到了byte []的副本,而不是引用。例如,如果我跑......
byte[] imgBytes = ((DataBufferByte) img.getData().getDataBuffer()).getData();
...我得到两个明显不同的对象哈希。如果我没有弄错,这表明我没有得到对底层字节[]的引用,而是一个副本。如果是这种情况,我该如何直接编辑System.out.println(System.identityHashCode(imgBytes));
System.out.println(System.identityHashCode((DataBufferByte) img.getData().getDataBuffer()).getData());
???
或许我只是设置像素错误...当我在imgBytes中设置像素时,它似乎对BufferedImage没有任何作用。一旦我得到byte [],我就像这样设置每个像素值:
DataBufferByte
对我而言,这一切似乎都很好。我可以通过这种方式读取像素,所以看起来我应该能够以同样的方式编写它们!
答案 0 :(得分:2)
我遇到了同样的问题。您可能不会使用getData(),而是使用getRaster(),它会为您提供一个可用于写入的数组。
答案 1 :(得分:1)
我曾经玩过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方法即可。
还有其他一些方法可以实现您的目标,但这种方法对我来说最简单。
答案 2 :(得分:0)
以下是它在JDK7中的实现方式。如果这些东西不适合你,你可能会在其他地方出现错误。
public byte[] getData() {
theTrackable.setUntrackable();
return data;
}