画像からExif情報を抜き出すJavaプログラム

Java

スマートフォンやデジタルカメルで撮影した画像のメタ情報として、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


sakusaku

都内でSIerをやっています。 使用している技術は、Java、PHP、MySQL、PostgreSQL、Oracle、Apache、Tomcat、あたりです。 Pythonやってみたいです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください