如何从包含像素的数组创建BufferedImage?

3

我使用getRGB()方法从BufferedImage中获取像素。像素存储在一个名为data[]的数组中。在对数据数组进行一些操作后,我需要再次创建一个BufferedImage,以便将其传递给一个模块,该模块将显示修改后的图像,但我卡在这里了。

3个回答

26

我使用 getRGB() 方法从 BufferedImage 中获取像素。像素存储在名为 data[] 的数组中。

请注意,这可能非常慢。如果您的 BufferedImage 支持,您可能希望直接访问底层的 int[] 并从那里直接复制/读取像素。

例如,要快速将您的 data[] 复制到新 BufferedImage 的底层 int[] 中:

BufferedImage bi = new BufferedImage( w, h, BufferedImage.TYPE_INT_ARGB );
final int[] a = ( (DataBufferInt) res.getRaster().getDataBuffer() ).getData();
System.arraycopy(data, 0, a, 0, data.length);
当然你要确保你的data[]包含的像素与你的BufferedImage相同的表示方式(在这个例子中为ARGB)。

1
这是更好的答案。我想不出任何情况下setRGB是任何问题的最佳解决方案。 - man guy
3
你的代码里可能有错误:你是不是应该用 bi.getRaster 而不是 res.getRaster - RDM
@manguy,我认为他们的答案不起作用,我已经尝试过了。我认为这是因为他们使用BufferedImage数据创建了一个数组,但该数组实际上并没有指向BufferedImage。它只是创建了一个新的引用。 - Some Guy

0
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

然后再次设置像素。

bufferedImage.setRGB(x, y, your_value);

注:正如评论中所述,请使用 @TacticalCoder 的答案。


2
你不应该逐个像素地遍历整个图像并设置一个位。你应该一次性复制整个缓冲区。 - Yochai Timmer
2
这是一种可怕的方式来设置缓冲图像中的所有像素,不应该被接受为答案。 - user_4685247

-1

您可以使用setRGB方法为新图像中的像素设置RGB(int)值。


我该如何创建 BufferedImage? - Saurabh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接