2

我正在尝试使用类型的底层DataBufferByte来尽可能快地设置像素值。BufferedImageTYPE_3BYTE_BGR

也许我不理解,但是当我执行以下操作时...

byte[] imgBytes = ((DataBufferByte) img.getData().getDataBuffer()).getData();

...似乎我得到了 byte[] 的副本而不是参考。例如,如果我运行...

System.out.println(System.identityHashCode(imgBytes));
System.out.println(System.identityHashCode((DataBufferByte) img.getData().getDataBuffer()).getData());

...我得到两个明显不同的对象哈希。如果我没记错的话,这表明我没有得到对底层 byte[] 的引用,而是一个副本。如果是这种情况,我应该如何DataBufferByte直接编辑???

或者我只是设置错误的像素......当我在 imgBytes 中设置像素时,它似乎对 BufferedImage 没有任何作用。一旦我得到字节 [],我将每个像素值设置如下:

imgBytes[intOffset] = byteBlue;
imgBytes[intOffset+1] = byteGreen;
imgBytes[intOffset+2] = byteRed;

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

4

3 回答 3

3

我有同样的问题。您可能不使用 getData() 但使用 getRaster() 它为您提供了一个可用于写入的数组。

于 2015-12-09T15:16:53.490 回答
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方法。

还有其他几种方法可以实现您正在寻找的东西,但这种方法对我来说是最简单的。

于 2012-11-11T03:00:34.417 回答
0

这是它在JDK7中的实现方式。如果这些东西对您不起作用,您可能会在其他地方遇到错误。

public byte[] getData() {
    theTrackable.setUntrackable();
    return data;
}
于 2013-05-13T18:37:53.047 回答