【问题标题】:How to get the rgb values of a jpeg image in TYPE_3BYTE_BGR?如何在 TYPE_3BYTE_BGR 中获取 jpeg 图像的 rgb 值?
【发布时间】:2012-08-11 04:15:00
【问题描述】:

我有这张图片:

我想在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,所以我猜这是幕后发生的解码问题,但我不知道如何解决它(或者更清楚地了解正在发生的事情)。

有人对如何正确解码这种类型有建议吗?

【问题讨论】:

标签: java image image-processing jpeg rgb


【解决方案1】:

在对不同解决方案进行广泛测试后,我发现了 com.sun.imageio.plugins.jpeg.JPEGImageReader 类(ImageIO 类用于解码 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()。图像是异步加载的(我认为这是一个小缺点),但至少它可以正确加载我的图像。不过,我不能 100% 确定最后一个解决方案是否可以在所有平台/JVM 上移植。

【讨论】:

    猜你喜欢
    • 2011-12-10
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2017-05-28
    相关资源
    最近更新 更多