スマートフォンやデジタルカメルで撮影した画像のメタ情報として、Exifという情報があります。
このExif情報には、画像を取った位置情報や画像の確度といった、様々なメタ情報が格納されています。
今回は、このExif情報をJavaで取得する方法を紹介していきます。
環境情報
Java:Java1.8.0_281
Exif情報の取得プログラム
Exif情報の取得サンプルプログラムは以下になります。
出力結果が解り易いように、出力結果を「Exif IFD0」「Exif SubIFD」「GPS」の3つのカテゴリ毎に出力をおこなっています。
サンプルプログラムではExif情報を「Metadata」に格納し、「getDirectories()」でメタ情報を取得していきます。
Exif情報の代表的な以下3つの情報を、標準出力しています。
項目 |
Tagクラスのメソッド |
出力内容 |
タグタイプ |
getTagType() |
Exif情報のID |
タグ名 |
getTagName() |
タグのタイプ(名称) |
説明 |
getDescription() |
設定内容 |
import java.io.File; import com.drew.imaging.ImageMetadataReader; import com.drew.imaging.ImageProcessingException; import com.drew.metadata.Directory; import com.drew.metadata.Metadata; import com.drew.metadata.Tag; public class Exif { /** Exif IFD0 */ private static final String STR_IFD = "Exif IFD0"; /** Exif SubIFD */ private static final String STR_SUBIFD = "Exif SubIFD"; /** GPS */ private static final String STR_GPS = "GPS"; // メイン処理 public static void main(String[] args){ System.out.print("start: Exif\r\n"); try { /** 対象ファイルを読み込み */ File file = new File("./sample.jpg"); Metadata metadata = ImageMetadataReader.readMetadata(file); /** ディレクトリ情報でループ */ for (Directory directory : metadata.getDirectories()) { String dirName = directory.getName(); /** Exif IFD0 */ if (STR_IFD.equals(dirName)) { System.out.print( "------directoryName=" + dirName + "------\r\n"); for (Tag tag : directory.getTags()) { String tagName = tag.getTagName(); int tagType = tag.getTagType(); String desc = tag.getDescription(); System.out.print( Integer.toString(tagType) + ":" + tagName + "=" + desc + "\r\n"); } } /** Exif SubIFD */ if (STR_SUBIFD.equals(dirName)) { System.out.print( "------directoryName=" + dirName + "------\r\n"); for (Tag tag : directory.getTags()) { String tagName = tag.getTagName(); int tagType = tag.getTagType(); String desc = tag.getDescription(); System.out.print( Integer.toString(tagType) + ":" + tagName + "=" + desc + "\r\n"); } } /** GPS */ if (STR_GPS.equals(dirName)) { System.out.print( "------directoryName=" + dirName + "------\r\n"); for (Tag tag : directory.getTags()) { String tagName = tag.getTagName(); int tagType = tag.getTagType(); String desc = tag.getDescription(); System.out.print( Integer.toString(tagType) + ":" + tagName + "=" + desc + "\r\n"); } } } } catch (Exception e) { System.out.print("occured exception \r\n"); } System.out.print("end: Exif\r\n"); } }
Exif情報の取得例
Exif情報の取得例を以下に説明します。
今回は、ネットで公開しているExif情報が格納されている画像に対してサンプルプログラムを実行しています。
Exif情報を確認すると、画像を撮影した位置情報について格納されていることが確認できます。
一番下に出力されている「0:GPS」~「27:GPS」の情報になります。
start: Exif ------directoryName=Exif IFD0------ 270:Image Description=SA390025 271:Make=KDDI-SA 272:Model=W51SA 274:Orientation=Top, left side (Horizontal / normal) 282:X Resolution=72 dots per inch 283:Y Resolution=72 dots per inch 296:Resolution Unit=Inch 306:Date/Time=2008:07:08 15:32:08 531:YCbCr Positioning=Center of pixel array ------directoryName=Exif SubIFD------ 33437:F-Number=f/3.0 36864:Exif Version=2.20 36867:Date/Time Original=2008:07:08 15:32:08 36868:Date/Time Digitized=2008:07:08 15:32:08 37121:Components Configuration=YCbCr 37378:Aperture Value=f/2.8 37379:Brightness Value=1 37381:Max Aperture Value=f/2.8 37382:Subject Distance=0.0 metres 37383:Metering Mode=Average 37384:White Balance=Unknown 37385:Flash=Flash did not fire, auto 37386:Focal Length=4.8 mm 40960:FlashPix Version=1.00 40961:Color Space=sRGB 40962:Exif Image Width=1600 pixels 40963:Exif Image Height=1200 pixels 41729:Scene Type=Directly photographed image 41985:Custom Rendered=Normal process 41986:Exposure Mode=Auto exposure 41987:White Balance Mode=Auto white balance 41988:Digital Zoom Ratio=1 41989:Focal Length 35=28 mm 41990:Scene Capture Type=Standard 41992:Contrast=None 41993:Saturation=None 41994:Sharpness=None 41996:Subject Distance Range=Unknown ------directoryName=GPS------ 0:GPS Version ID=2.200 1:GPS Latitude Ref=N 2:GPS Latitude=35° 42' 2.91" 3:GPS Longitude Ref=E 4:GPS Longitude=139° 45' 57.52" 18:GPS Map Datum=WGS-84 27:GPS Processing Method=65 83 67 73 73 0 0 0 71 80 83 45 70 73 88 end: Exif