使用BufferedImage的DataBuffer设置像素

使用BufferedImage的DataBuffer设置像素

问题描述:

我试图使用类型TYPE_3BYTE_BGRBufferedImage的底层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; 

对我来说,这一切似乎罚款。我可以用这种方式读取像素,所以看起来我应该可以用相同的方式写出它们!

+0

为了更快提供更好的帮助,请发布[SSCCE](http://sscce.org/)。热链接到一个小的(以字节为单位)的图像或在代码中生成一个。 –

我曾经玩过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方法。

还有其他一些方法可以实现您要查找的内容,但这种方法对我来说最简单。

+0

有趣的...我将不得不用一个ImageTypeSpecifier&ColorModel来测试它,以便与byte []而不是int []一起使用它,但是这种方法看起来很有前途。 我假设这和编辑已有的BufferedImage的DataBuffer一样快,对吧? – Marty

+0

据我所知他们会大致相同,但我没有长时间触及它,只是认为我会提供一个不同的解决方案:)。 – Jyro117

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

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

我有同样的问题。你可能不使用getData(),而是使用getRaster(),它给你一个你可以用来写入的数组。