JavaでEXIF情報を取得するサンプルプログラム
ズバット引越し比較
Posted on 2021/9/8 at 2:24
Update on 2021/9/10 at 4:58
デジカメやiPhoneで撮影した写真には、Exif情報という撮影日時や撮影に使用した設定内容が自動で付与されています。 今回はApache Commons Imagingというライブラリを使用してJPEG画像内のExif情報を読み込んでみます。
Apache Commons Imagingのダウンロード
Apache Commons Imagingのダウンロードページ の「Binaries」から 「commons-imaging-1.0-alpha2-bin.zip」をダウンロード、 解凍し使用しているIDEのプロジェクトの「ビルド・パス」にcommons-imaging-1.0-alpha2.jarを追加します。
サンプルコード
jpgディレクトリ内のtest.jpgファイルを読み込んで、Exif情報を標準出力します。
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.apache.commons.imaging.ImageReadException;
import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.common.ImageMetadata;
import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
import org.apache.commons.imaging.formats.tiff.TiffField;
import org.apache.commons.imaging.formats.tiff.TiffImageMetadata;
public class MetadataReader {
public static void main(String[] args) {
try {
readMetadata(new File("jpg/test.jpg"));
} catch (ImageReadException | IOException e) {
e.printStackTrace();
}
}
public static void readMetadata(File file) throws ImageReadException, IOException {
final ImageMetadata metadata = Imaging.getMetadata(file);
if (metadata instanceof JpegImageMetadata) {
final JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
final TiffImageMetadata exif = jpegMetadata.getExif();
final List fields = exif.getAllFields();
for (final TiffField field: fields) {
System.out.println(getFieldInfo(field));
}
}
}
public static String getFieldInfo(TiffField field) {
// field.getTag(): タグ番号
// field.getTagInfo().name: タグ英語名称
// field.getValueDescription(): 値
return field.getTag() +
" " +
field.getTagInfo().name +
": " +
field.getValueDescription();
}
}
サンプルに使用した画像
たびたびこのブログに登場いたします、ドメイン名の由来ともなった我が家の猫たちです。 子猫の時の写真が出てきてめっちゃ可愛かったので、使わせていただきました。 グレーの猫が「れん」君で、さびがらの猫が「なな」ちゃんです。今後ともよろしくお願いいたします。
下の写真はブログ用に縮小しましたので、元画像のExifを確認したい方は こちらから画像ダウンロードしてください。
プログラムの実行結果
タグの英語名称だけではわかりずらいので、出力された英語名称に日本語名称を付け加えました。
270 ImageDescription(タイトル): ''
271 Make(カメラの製造元): 'SONY'
272 Model(カメラのモデル): 'NEX-5R'
274 Orientation(画像方向): 1
282 XResolution(水平方向の解像度): 350
283 YResolution(垂直方向の解像度): 350
296 ResolutionUnit(解像度の単位): 2
305 Software(プログラム名): 'NEX-5R v1.03'
306 DateTime(ファイル変更日時): '2020:02:02 13:37:58'
531 YCbCrPositioning(YCCの画素構成): 2
34665 ExifOffset(Exifタグ): 360
50341 PrintIM: 80, 114, 105, 110, 116, 73, 77, 0, 48, 51, 48, 48, 0, 0, 3, 0, 2, 0, 1, 0, 0, 0, 3, 0, 34, 0, 0, 0, 1, 1, 0, 0, 0, 0, 9, 17, 0, 0, 16, 39, 0, 0, 11, 15, 0, 0, 16, 39, 0, 0, -105... (106)
33434 ExposureTime(露出時間): 1/125 (0.008)
33437 FNumber(絞り値): 56/10 (5.6)
34850 ExposureProgram(露出プログラム): 2
34855 PhotographicSensitivity(撮影感度): 3200
34864 Unknown Tag: 2
34866 Unknown Tag: 3200
36864 ExifVersion(Exifバージョン): 48, 50, 51, 48
36867 DateTimeOriginal(撮影日時): '2020:02:02 13:37:58'
36868 DateTimeDigitized(デジタルデータ生成日時): '2020:02:02 13:37:58'
37121 ComponentsConfiguration(各コンポーネントの意味): 1, 2, 3, 0
37122 CompressedBitsPerPixel(画像圧縮モード): 2
37379 BrightnessValue(輝度値): 4044/2560 (1.58)
37380 ExposureCompensation(露光補正値): 0
37381 MaxApertureValue(レンズ最小F値): 1272/256 (4.969)
37383 MeteringMode(測光方式): 5
37384 LightSource(光源): 0
37385 Flash(フラッシュ): 16
37386 FocalLength(レンズ焦点距離): 135
37500 MakerNote(メーカノート): 83, 79, 78, 89, 32, 68, 83, 67, 32, 0, 0, 0, 90, 0, 3, 16, 4, 0, 16, 0, 0, 0, -36, 7, 0, 0, 0, 32, 7, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 32, 7, 0, 98, -104, 8, 0, 118, 86, 62, 0, 2... (35680)
37510 UserComment(ユーザコメント): ''
40960 FlashpixVersion(対応フラッシュピックスバージョン): 48, 49, 48, 48
40961 ColorSpace(色空間情報): 1
40962 ExifImageWidth(実効画像幅): 4912
40963 ExifImageLength(実効画像高さ): 3264
40965 InteropOffset(互換性IFDへのポインタ): 36726
41728 FileSource(ファイルソース): 3
41729 SceneType(シーンタイプ): 1
41985 CustomRendered(個別画像処理): 0
41986 ExposureMode(露出モード): 0
41987 WhiteBalance(ホワイトバランス): 0
41988 DigitalZoomRatio(デジタルズーム倍率): 1
41989 FocalLengthIn35mmFormat(35mm換算レンズ焦点距離): 202
41990 SceneCaptureType(撮影シーンタイプ): 0
41992 Contrast(撮影コントラスト): 0
41993 Saturation(撮影彩度): 0
41994 Sharpness(撮影シャープネス): 0
42034 LensSpecification(レンズの仕様情報): 55, 210, 45/10 (4.5), 63/10 (6.3)
42036 LensModel(レンズのモデル名): 'E 55-210mm F4.5-6.3 OSS'
1 InteroperabilityIndex(互換性識別子): 'R98'
2 InteroperabilityVersion: 48, 49, 48, 48
259 Compression(圧縮の種類): 6
270 ImageDescription(画像タイトル): ''
271 Make(カメラの製造元): 'SONY'
272 Model(カメラのモデル): 'NEX-5R'
274 Orientation(画像方向): 1
282 XResolution(水平方向の解像度): 350
283 YResolution(垂直方向の解像度): 350
296 ResolutionUnit(解像度の単位): 2
305 Software(プログラム名): 'NEX-5R v1.03'
306 DateTime(ファイル変更日時): '2020:02:02 13:37:58'
513 JpgFromRawStart(JPEGのSOIへのオフセット): 37014
514 JpgFromRawLength(JPEGのデータバイト数): 9071
531 YCbCrPositioning(YCCの画素構成): 2
Exif情報内の位置情報について
出力結果を見てわかるとおり、画像には画素データ以外にも様々なデータがExif情報として組み込まれています。 今回は一眼レフカメラにて撮影した写真なので、GPSによる位置情報は付与されていませんが、 スマホのカメラアプリで撮影した画像には、設定によっては撮影した位置情報が付与されます。「これどこで撮った写真だっけ?」なんて困ることがなくなるため 便利ではありますが、SNSやブログなどにそのまま画像をアップロードすると、個人情報が漏洩してしまう可能性があります。
そういったトラブルに巻き込まれないようExif情報は削除するか、スマホのカメラアプリの位置情報はOFFにしておくことを強くお勧めいたします。
Exif情報の中の位置情報を削除する方法
Windows標準機能により削除する方法と、プログラミングにより削除する方法を紹介します。
JavaでEXIFを取得し、画像を正しい向きに回転させる
Apache Commons Imagingというライブラリを使用して 画像の回転に関するEXIFデータを読み取って、正しい向きに修正した状態で保存するサンプルプログラム。