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

aym*_*ric 5 java rgb jpeg image image-processing

我有这个图像:

谷歌图片

我想在一个中提取这个图像的RGB值int[].这是我到目前为止为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());
Run Code Online (Sandbox Code Playgroud)

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

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

有没有人会对如何正确解码这种类型提出建议?

aym*_*ric 3

经过对不同解决方案的广泛测试后,我发现了该类com.sun.imageio.plugins.jpeg.JPEGImageReader(该类用于解码 JPEG 的类ImageIO)的一个错误。

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

BufferedImage bi = ImageIO.read(new FileInputStream("t.jpg"));
Run Code Online (Sandbox Code Playgroud)

然后我得到偏红色的图像。

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

JPEGImageDecoder jpegDec = JPEGCodec.createJPEGDecoder(new FileInputStream("t.jpg"));
BufferedImage bi = jpegDec.decodeAsBufferedImage();
Run Code Online (Sandbox Code Playgroud)

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

最后,我尝试过的另一种有效方法是使用Toolkit.getDefaultToolkit().createImage(). 图像是异步加载的(我认为这是一个小缺点),但至少它可以正确加载我的图像。不过,我不能 100% 确定最后一个解决方案在所有平台/JVM 上都是可移植的。