JPEG画像には、画像データとともに、いろいろなデータが書き込まれています。
Apache Commons Imagingの入手
mavenを使って入手
pom.xmlは、こんな感じ。
今回は画像ファイル操作なので、Apache Commonsの中でも「Apache Commons Imaging」が対象。
1 2 3 4 5 6 | <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-imaging --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-imaging</artifactId> <version>1.0-alpha3</version> </dependency> |
手動で入手
手動で入手するのであれば、以下のjarを入手することになります。
「Apache Commons Imaging」は依存関係がないので、手動でも簡単に手に入れられますね。
https://mvnrepository.com/repos/central
- commons-imaging-1.0-alpha3.jar
※2023年10月現在です。
ちなみに、Apache License 2.0で提供されています。
JPEG画像からExifデータを読み込むサンプル
Apache Commons Imagingを使って、JPEG画像からExifデータを読み込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | import java.io.File; import java.io.IOException; import org.apache.commons.imaging.ImageReadException; import org.apache.commons.imaging.Imaging; 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 ExifTest { public static void main(String[] args) throws ImageReadException, IOException { //JPEGファイル File file = new File("C:\\work\\test.jpeg"); //JPEGファイルからメタデータ(ヘッダ)を取得 JpegImageMetadata metadata = (JpegImageMetadata) Imaging.getMetadata(file); //EXIFを取得 TiffImageMetadata exifMetadata = metadata.getExif(); for (TiffField field : exifMetadata.getAllFields()) { //項目名と値を取得 String tagName = field.getTagName(); Object value = field.getValue(); if(value instanceof Object[]) { Object[] oArray = (Object[])value; System.out.print(tagName + " : "); for (Object o : oArray) { System.out.print(o + ","); } System.out.println(); }else { System.out.println(tagName + " : " + value); } } } } |
実行結果
このようなExifデータが取得できます。
経度・緯度は、京都駅あたりにしています。
1 2 3 4 5 6 7 8 9 10 11 | ImageWidth : 3468 ImageLength : 4624 Make : <スマホのメーカー名> Model : <スマホの機種名> (略) GPSLatitudeRef : N GPSLatitude : 34,59,2665/100 (26.65), GPSLongitudeRef : E GPSLongitude : 135,45,2435/100 (24.35), GPSDateStamp : 2022:09:17 (略) |
サンプルの解説
Imaging.getMetadata(File)で画像ファイルを読み込むと、JpegImageMetadataが取得できます。
JpegImageMetadata#getExif()でExifデータを取得。
あとは、getTagName()で項目名。getValue()で値が取得できます。
この例では、少し手抜き省略していますが、値で返却される型は結構バラバラです。
たとえば、ImageWidth,ImageLengthは、java.lang.Short。Make,Modelは、java.lang.String。
GPSLatitude,GPSLongitudeは、org.apache.commons.imaging.common.RationalNumberの配列(度・分・秒)です。