2016-07-19 6 views
1

JLabelで画像を使っていましたが、私が使っていた画像(黒を含むもの)のほうが、することが。画像はImageIO#read(File)によってロードされました。 ImageIconコンストラクタを介してロードされた画像は、通常のように見えます。ImageIO.readを使用すると、修正された画像が得られます

Test image

JFrame frame = new JFrame(); 
frame.setLayout(new FlowLayout()); 
frame.setSize(320, 320); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

URL imageURL = new URL("https://wiki.factorio.com/images/Crude-oil.png"); 

frame.add(new JLabel(new ImageIcon(ImageIO.read(imageURL)))); 

frame.add(new JLabel(new ImageIcon(imageURL))); 

frame.setVisible(true); 

結果:

ここで私は、この画像のために一緒に投げた小さなテストです

Result

すべてのアイデアは、これが起こっかもしれない理由を?

答えて

2

これは既知のbugであり、ImageIO.read()が画像の適切なカラーモデルを見つけられなかった場合に発生します。

逆に、コンストラクタImageIcon(Url)は、Toolkit.getDefaultToolkit().getImage(Url)を使用してイメージを取得するときに、イメージを適切に表示します。

このバグは他の画像拡張でも発生する可能性があります。 thisを参照してください。

EDIT

スクロールダウンし、以下のリンクからPNGセクションで色タイプを比較します。

http://regex.info/exif.cgi?imgurl=https://wiki.factorio.com/images/Crude-oil.png

http://regex.info/exif.cgi?imgurl=http://www.sherv.net/cm/emoticons/hand-gestures/victory-fingers-black-smiley-emoticon.png

あなたはカラータイプの両方が両方の画像がPNGファイルであることに加えて異なっていることがわかります。 ImageIO.read()の問題は、アルファとのRGBを正しく読み取ることができますが、グレースケールのアルファでは正しく読み取れません。

また、ImageIO.read().getType()は、最初のイメージでは0 = TYPE_CUSTOM、2番目のイメージでは6 = TYPE_4BYTE_ABGRを返します。 タイプが認識されない画像の場合は、通常TYPE_CUSTOMが返されます。

+0

ありがとうございます。興味深いのはあなたのリンク(バグと他の答え)の両方がJPEGを参照しているのに対し、私はPNGです。 – ricky3350

+1

申し訳ありませんが、PNG関連のリファレンスは見つかりませんでしたが、今は面白いものが見つかりました。編集内容を確認してください。 –

+0

また興味深い。私は余分な研究に非常に感謝します。私はもう一度upvoteすることはできません、または私は、恐れている。 – ricky3350

関連する問題