使用BufferedImage的DataBuffer来设置像素

时间:2012-11-11 02:42:52

标签: java bufferedimage

我正在尝试使用类型为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

对我而言,这一切似乎都很好。我可以通过这种方式读取像素,所以看起来我应该能够以同样的方式编写它们!

3 个答案:

答案 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;
}