2017-12-05 13 views
0

JPEG画像では、EXIFメタデータが含まれている場合があり、画像をどのような方向で表示するかを指示します。ImageIO.read()はEXIF方向メタデータを考慮していますか?

質問は、JavaのImageIO.read()がJPEG画像を読んでいる間にEXIFを考慮して自動的に変換を適用するかどうかです。

より具体的には、EXIFを使用してJPEG画像をPNG画像に変換するためにJavaのImageIOを使用する場合、PNG画像の向きは正しいでしょうか?または、EXIFオリエンテーションの指示を考慮に入れずに、PNG画像を生成する以下のコードですか?

private byte[] convertToPng(byte[] imageFileAsByteArray) { 
    ByteArrayInputStream bis = new ByteArrayInputStream(imageFileAsByteArray); 
    BufferedImage bi = ImageIO.read(bis); 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    ImageIO.write(bi, "png", bos); 

    return bos.toByteArray(); 
} 
+0

'ImageIO.read()'はあなたのexifを読み込みません。 ImageReaderクラスを使用してイメージメタデータを読み込んでコピーする必要があります – Uata

+0

メタデータをコピーしたくありません。 PNGイメージにはEXIFエントリもありません。 EXIF値に従って画像を変換してから別の形式で保存したいのですが、EXIFエントリを忘れてしまいました。 – SomethingSomething

+1

はい、PNGです。私はこれを忘れて申し訳ありません。しかし、とにかくメタデータを手動で抽出し、それを使ってイメージを変換する必要があります。このライブラリも良いです:https://github.com/drewnoakes/metadata-extractor – Uata

答えて

2

短い答えは、残念ながら、いいえです。 ImageIO.read(..)(デフォルト)は、Exif Orientationタグを考慮しません。 PNGはそれに応じて回転されません。


しかし、すべてのImageIO.read(..)は内部で、入力のための適切なImageReaderプラグインを検索し、それを読んで委任することですありません。また、JREに同梱されているプラ​​グインではExifを考慮していませんが、サードパーティのImageReaderでサポートを追加することは可能です。残念ながら、私はそのことについてはわかりませんが、今後はExif orientation support to the TwelveMonkeys ImageIO JPEGImageReaderを追加することを検討しています。

メタデータを読み込んで回転することで、自分で回転を適用する必要があります。オリエンテーションタグの値は、ImageIO JPEG metadataまたはサードパーティのライブラリを使用して取得できます。私は、この目的のために、metadata-extractorまたはTwelveMonkeys ImageIOの両方を使用できると思います。 JAI ImageIO(TIFFメタデータを使用)はおそらくこれを行うこともできます。 ImageIOにJPEGメタデータを使用している場合

、注意してください。

EXIFメタデータを解釈することを望むアプリケーションは、タグが示すとunknownマーカセグメントをチェックしなければならないjavax_imageio_jpeg_image_1.0形式でメタデータツリー構造を与えられた。なおAPP1マーカーを含み、それをExifマーカーセグメントとして識別するデータを含む。

関連する問題