2014-03-01 293 views
2

我在Java中处理RGB值的时间非常糟糕,这让我开始尝试使用这种小型实验。在BufferedImage上获取和设置RGB值

我想到了这一点:加载一张图片,获取它的rgb值并创建一个具有相同值的新图片。不幸的是,这不起作用(图像显示不同,见图片),按照以下代码...有人可以看到有什么问题吗?

BufferedImage oriImage=ImageIO.read(new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png")); 

int[] oriImageAsIntArray = new int[oriImage.getWidth()*oriImage.getHeight()]; 
oriImage.getRGB(0, 0, oriImage.getWidth(),oriImage.getHeight(), oriImageAsIntArray, 0, 1); 

BufferedImage bfImage= new BufferedImage(oriImage.getWidth(),oriImage.getHeight(), 
      BufferedImage.TYPE_INT_ARGB); 

bfImage.setRGB(0,0,bfImage.getWidth(),bfImage.getHeight(),oriImageAsIntArray, 0, 1); 

output

回答

4

显然,getRGBsetRGB没有被正确使用。

我改变了代码:

oriImage.getRGB(0, 0, oriImage.getWidth(),oriImage.getHeight(), oriImageAsIntArray, 0, oriImage.getWidth()); 
(...) 
bfImage.setRGB(0,0,bfImage.getWidth(),bfImage.getHeight(),oriImageAsIntArray, 0, bfImage.getWidth()); 

...和画面正常显示。我仍然不明白这最后一个论点是什么。在JavaDoc中,它被描述为:

scansize - scanline stride for the rgbArray 
+0

它看起来像最后一个参数是图像的宽度,以便该方法知道何时开始每个新行。 – Tharwen

+0

嗯,不知道:宽度已经发送作为第三个参数...和图像宽度已经在构造函数中设置... – Vespas

+9

这是扫描线的长度。 :-)在大多数情况下,这等于宽度,但也可以更大。对于某些显示/图像格式,将填充放置在每个扫描行的末尾是有意义的(例如,以确保每条新行以偶数开始,即下一个字/长字边界)。这些填充像素不会使图像更宽,但仍然是后备数据缓冲区/数组的一部分,这就是为什么您需要这个参数。只要你使用值> =图像宽度,并在两个地方使用相同的值,你应该是好的。说得通? :-) – haraldK