如何在TYPE_3BYTE_BGR中获取jpeg图像的rgb值?

时间:2012-08-14 19:42:25

标签: java image image-processing jpeg rgb

我有这张图片:

Google image

我想在int[]中提取此图像的RGB值。这是我到目前为止为PNG图像所做的事情:

File f = new File("t.jpg");
BufferedImage img = ImageIO.read(f);
int[] ib = img.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth());
Color c = new Color(ib[0]);
System.out.println(c.getRed() + " " + c.getGreen() + " " + c.getBlue());

但是在这里我得到了这个输出:255 128 128这是预期的,因为我清楚地看到(并且在几个图像编辑器中验证过)(0,0)处的像素具有这些值255 255 255

我注意到img.getType()返回的类型等于TYPE_3BYTE_BGR所以我猜这是在场景后面发生的解码问题,但我无法弄清楚如何解决它(或者更清晰了解正在发生的事情。)

是否有人会对如何正确解码此类型提出建议?

1 个答案:

答案 0 :(得分:3)

经过对不同解决方案的大量测试后,我出现了类com.sun.imageio.plugins.jpeg.JPEGImageReaderImageIO类用于解码JPEG的类)的错误。

如果我这样做(由Oracle推荐,因为它应该适用于所有JVM和SO中的许多其他线程):

BufferedImage bi = ImageIO.read(new FileInputStream("t.jpg"));
然后我得到了红色的图像。

另一方面,如果我这样做:

JPEGImageDecoder jpegDec = JPEGCodec.createJPEGDecoder(new FileInputStream("t.jpg"));
BufferedImage bi = jpegDec.decodeAsBufferedImage();

然后我得到正确解码的图像。 (请注意,com.sun.image.codec.jpeg.JPEGCodec是Sun / Oracle JVM的特定类,因此此解决方案不可移植。)

最后,我尝试的另一种方法是使用Toolkit.getDefaultToolkit().createImage()。图像是异步加载的(在我看来很小的缺点),但至少它可以正确加载我的图像。我不是百分之百确定最后一个解决方案是否可以在所有平台/ JVM上移植。