Java 使用BuffereImage的DataBuffer设置像素

Java 使用BuffereImage的DataBuffer设置像素,java,bufferedimage,Java,Bufferedimage,我试图使用类型为类型为

我试图使用
类型为
类型为
缓冲图像的底层
数据缓冲字节
来尽快设置像素值

也许我不理解,但当我做以下事情时

byte[] imgBytes = ((DataBufferByte) img.getData().getDataBuffer()).getData();
。。。似乎我得到的是字节[]的副本,而不是引用。例如,如果我跑步

System.out.println(System.identityHashCode(imgBytes));
System.out.println(System.identityHashCode((DataBufferByte) img.getData().getDataBuffer()).getData());
。。。我得到两个明显不同的对象哈希。如果我没有弄错的话,这表明我没有得到对底层字节[]的引用,而是得到了一个副本。如果是这种情况,我应该如何直接编辑
DataBufferByte

或者我只是把像素设置错了。。。当我在imgBytes中设置像素时,它似乎对BuffereImage没有任何作用。获得字节[]后,我将每个像素值设置为:

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类调用该方法即可


有一些其他的方法可以实现您想要的,但是这个方法对我来说是最简单的。

下面是它在JDK7中的实现方式。如果这些东西不适合你,你可能会在其他地方出错

public byte[] getData() {
    theTrackable.setUntrackable();
    return data;
}

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

要更快地获得更好的帮助,请发布一篇文章。热链接到一个小的(字节)图像或生成一个代码。有趣的。。。我必须用ImageTypeSpecifier&ColorModel来测试这一点,以便将它与byte[]而不是int[]一起使用,但这种方法似乎很有前途。我假设这将与编辑一个预先存在的BuffereImage的DataBuffer一样快,对吗?据我所知,它们大致相同,但我已经很久没有接触过它了,我只是想提供一个不同的解决方案:)。