5

私はこの画像を持っています:

Googleの画像

この画像の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());

しかし、ここでこの出力が得られます。255 128 128これは、(0,0)のピクセルがこれらの値を持っていることを明確に確認している(そしていくつかの画像エディターで確認している)ため、予期されていません255 255 255

によって返される型がTYPE_3BYTE_BGRimg.getType()と等しいことに気付いたので、これはバックグラウンドで発生しているデコードの問題だと思いますが、回避方法を理解できません(または何が起こっているのかをより明確に理解できません)。

このタイプを適切にデコードする方法について誰かが提案を持っていますか?

4

1 に答える 1

3

さまざまなソリューションを徹底的にテストした後、クラスcom.sun.imageio.plugins.jpeg.JPEGImageReader(クラスによる JPEG のデコードに使用されるクラスImageIO) のバグが見つかりました。

私がそうする場合(これはすべてのJVMおよびSOの他の多くのスレッドで動作するはずなので、Oracleが推奨します):

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 の特定のクラスであるため、このソリューションは移植可能ではないことに注意してください)。

最後に、私が試したもう 1 つのアプローチは、 を使用することToolkit.getDefaultToolkit().createImage()です。画像は非同期で読み込まれます (私の意見では小さな欠点です) が、少なくとも画像を適切に読み込むことができました。ただし、この最後のソリューションがすべてのプラットフォーム/JVM で移植可能であるとは 100% 確信が持てません。

于 2012-08-18T15:18:50.373 に答える