Java實現獲取圖片和視頻文件的Exif信息

前言

隨著現在實景地圖的如火如荼建設,無人機等航拍測繪手段的不斷升級,我們在獲取全景照片或者正射影像,全景視頻等數據上更加快速、便捷。由於無人機本身不進行相關數據的處理,比如全景地圖的生成、視頻的信息解析等。以全景照片為例,無人機作業時一般會在拍攝時自動記錄GPS信息,拍照的坐標信息。通過自動獲取圖片的經緯度信息,可以快速對照片進行定位。而我們在旅遊時,通常都會進行拍照,通過開啟自動記錄位置後,隨時可以幫助我們生成旅遊地圖。而這些基本信息的獲取,就離不開對文件元數據(metadata)的讀取。

因此,本文將重點介紹如何使用Java編程語言結合metadata-extractor去自動獲取全景圖片的Exif信息,獲取照片的拍攝坐標信息。

一、相關知識簡介

1、Metadata 元數據

元數據(Matedata),又稱中介數據、中繼數據,為描述數據的數據(data about data),主要是描述數據屬性(property)的信息。用來支持如指示存儲位置、歷史數據、資源查找、文件記錄等功能。元數據是關於據的組織、數據域及其關系的信息。

圖片元數據(Metadata) 是嵌入到圖片文件中的一些標簽。比較像文件屬性,但是種類繁多。對於數碼圖像,目前常見的研數據有EXIF, IPTC和XMP三種。

EXIF:通常被數碼相機在拍攝照片時自動添加,比如相機型號、鏡頭、曝光、圖片尺寸等信息

IPTF:比如圖片標題、關鍵字、說明、作者、版權等信息。主要由人工在後期通過軟件寫入。

XMP:XMP實際上是一種元數據存儲和管理的標準,可以將Exif,IPTC或其他的數據都按XMP統一的格式存放在圖像文件中。

2、Exif 可交換圖像文件信息

可交換圖像文件(Exchangeable Image File,Exif)信息圖像在拍攝時保留的相關參數:比如圖像信息(廠商,分辨率等),相機拍攝記錄(ISO,白平衡,飽和度,銳度等),縮略圖(縮略圖寬度,高度等),GPS(拍攝時的經度,緯度,高度)等,按照圖像文件標準存儲在圖像頭文件。一般使用支持圖像讀取的軟件即可查看部分參數,但是圖像如果修改,Exif信息可能丟失。

上圖是一張帶瞭坐標的JPG照片信息,在Windows中通過查看文件的詳細信息,可以看到這張圖片的Exif信息。

3、metadata-extractor 庫

metadata-extractor 庫是一個用於提取圖片和視頻的Exif信息的組件庫。它主要提供的功能有:

更多的信息可以查看metadata-extractor相關介紹

二、使用步驟

1、創建Maven項目

在Pom.xml中引入metadata-extractor

<!-- https://mvnrepository.com/artifact/com.drewnoakes/metadata-extractor -->
<dependency>
    <groupId>com.drewnoakes</groupId>
    <artifactId>metadata-extractor</artifactId>
    <version>2.18.0</version>
</dependency>
 
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>

2、Metadata信息獲取

這裡使用ImageMetadataReader統一獲取元數據信息,針對Jpg、Png、Gif等還有針對性的類,JpegMetadataReader、PngMetadataReader、GifMetadataReader等。

Metadata metadata = ImageMetadataReader.readMetadata(file);
for (Directory directory : metadata.getDirectories()) {
     for (Tag tag : directory.getTags()) {
         String tagName = tag.getTagName();  //標簽名
         String desc = tag.getDescription(); //標簽信息
         System.out.println(tagName + "===" + desc);//照片信息
      }
}

通過代碼,正常輸出可以看到以下的信息:

Compression Type===Baseline
Data Precision===8 bits
Image Height===4096 pixels
Image Width===8192 pixels
Number of Components===3
Component 1===Y component: Quantization table 0, Sampling factors 2 horiz/2 vert
Component 2===Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert
Component 3===Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert
Image Width===8192 pixels
Image Height===4096 pixels
Bits Per Sample===8 8 8 bits/component/pixel
Image Description===default
Make===Hasselblad
Model===L1D-20c
Orientation===Top, left side (Horizontal / normal)
Samples Per Pixel===3 samples/pixel
X Resolution===72 dots per inch
Y Resolution===72 dots per inch
Resolution Unit===Inch
Software===10.00.12.07
Date/Time===2021:03:21 14:13:31
YCbCr Positioning===Center of pixel array
Windows XP Comment===0.9.142
Windows XP Keywords===pano
Exposure Time===1/200 sec
F-Number===f/5.0
Exposure Program===Program normal
ISO Speed Ratings===100
Exif Version===2.30
Date/Time Original===2021:03:21 14:13:31
Date/Time Digitized===2021:03:21 14:13:31
Components Configuration===YCbCr
Exposure Bias Value===0.3 EV
Max Aperture Value===f/2.8
Metering Mode===Average
White Balance===Daylight
Flash===Flash did not fire
Focal Length===10.3 mm
Makernote===[19829 values]
FlashPix Version===1.00
Color Space===sRGB
Exif Image Width===8192 pixels
Exif Image Height===4096 pixels
File Source===Digital Still Camera (DSC)
Scene Type===Directly photographed image
Exposure Mode===Auto exposure
White Balance Mode===Auto white balance
Digital Zoom Ratio===1
Scene Capture Type===Standard
Gain Control===None
Contrast===None
Saturation===None
Sharpness===None
Device Setting Description===0 0 0 0
Body Serial Number===0K8TGB40121511
Lens Specification===28mm f/2.8-11.0
Interoperability Index===Recommended Exif Interoperability Rules (ExifR98)
Interoperability Version===1.00
GPS Version ID===2.300
GPS Latitude Ref===N
GPS Latitude===28° 14' 37.6"
GPS Longitude Ref===E
GPS Longitude===112° 53' 24.86"
GPS Altitude Ref===Sea level
GPS Altitude===126 metres
Image Width===192 pixels
Image Height===90 pixels
Compression===JPEG
X Resolution===72 dots per inch
Y Resolution===72 dots per inch
Resolution Unit===Inch
Thumbnail Offset===21114 bytes
Thumbnail Length===18699 bytes
XMP Value Count===30
Number of Tables===4 Huffman tables
Detected File Type Name===JPEG
Detected File Type Long Name===Joint Photographic Experts Group
Detected MIME Type===image/jpeg
Expected File Name Extension===jpg
File Name===1.jpg
File Size===14057645 bytes
File Modified Date===星期二 三月 23 20:14:37 +08:00 2021

3、根據不同的Directory精確Tag提取

示例代碼如下: 

File jpegFile = new File(pathname);
Metadata metadata = JpegMetadataReader.readMetadata(jpegFile);
boolean type = metadata.containsDirectoryOfType(GpsDirectory.class);
System.out.println(type);
System.out.println(metadata.getDirectoryCount());
Iterable<Directory> it = metadata.getDirectories();
for(Directory d : it) {
    System.out.println(d);
    Collection<Tag> tags = d.getTags();
    for(Tag tag :tags) {
        System.out.println(tag.getTagName()+"==="+ tag.getDescription());
    }   
}

Image Width===849
Image Height===504
Bits Per Sample===8
Color Type===True Color
Compression Type===Deflate
Filter Method===Adaptive
Interlace Method===No Interlace
Detected File Type Name===PNG
Detected File Type Long Name===Portable Network Graphics
Detected MIME Type===image/png
Expected File Name Extension===png
File Name===111.png
File Size===61265 bytes
File Modified Date===星期日 十月 02 19:48:34 +08:00 2022

4、經緯度提取

通過GpsDirectory來獲取GeoLocation獲取經坐標信息

System.out.println("開始讀取gps信息...");
Collection<GpsDirectory> gpsDirectories = metadata.getDirectoriesOfType(GpsDirectory.class);
for(GpsDirectory gps : gpsDirectories) {
    //獲取圖片的經緯度信息
    GeoLocation geoLocation = gps.getGeoLocation();
    System.out.println(geoLocation.getLongitude());
    System.out.println(geoLocation.getLatitude());
    System.out.println("********************************************************");
}

開始讀取gps信息…
112.89023869444445
28.243777055555558
********************************************************
GPS Version ID===2.300
GPS Latitude Ref===N
GPS Latitude===28° 14' 37.6"
GPS Longitude Ref===E
GPS Longitude===112° 53' 24.86"
GPS Altitude Ref===Sea level
GPS Altitude===126 metres

將圖片的點在地圖上定位信息如上圖所示

5、視頻元數據提取

System.out.println("視頻信息提取");
File file = new File("E:/靜園歷史影像.mp4");
Metadata metadata = Mp4MetadataReader.readMetadata(file);
for (Directory directory : metadata.getDirectories()) {
     for (Tag tag : directory.getTags()) {
     String tagName = tag.getTagName();  //標簽名
     String desc = tag.getDescription(); //標簽信息
     System.out.println(tagName + "===" + desc);//照片信息
     }
}

視頻信息提取
Major Brand===MP4  Base Media v1 [IS0 14496-12:2003]
Minor Version===512
Compatible Brands===[MP4  Base Media v1 [IS0 14496-12:2003], MP4 Base Media v2 [ISO 14496-12:2005], MP4 Base w/ AVC ext [ISO 14496-12:2005], MP4 v1 [ISO 14496-1:ch13]]
Creation Time===Fri Jan 01 08:00:00 CST 1904
Modification Time===Fri Jan 01 08:00:00 CST 1904
Duration===52608
Media Time Scale===1000
Duration in Seconds===00:00:53
Transformation Matrix===65536 0 0 0 65536 0 0 0 1073741824
Preferred Rate===1
Preferred Volume===1
Next Track ID===3
Rotation===0
Creation Time===星期五 一月 01 08:00:00 +08:00 1904
Modification Time===星期五 一月 01 08:00:00 +08:00 1904
ISO 639-2 Language Code===und
Opcolor===0 0 0
Graphics Mode===Copy
Compression Type===H.264
Width===1366 pixels
Height===768 pixels
Depth===24-bit color
Horizontal Resolution===72
Vertical Resolution===72
Frame Rate===9.905
Creation Time===星期五 一月 01 08:00:00 +08:00 1904
Modification Time===星期五 一月 01 08:00:00 +08:00 1904
ISO 639-2 Language Code===und
Balance===0
Format===MPEG-4, Advanced Audio Coding (AAC)
Number of Channels===2
Sample Size===16
Sample Rate===48000
File Name===靜園歷史影像.mp4
File Size===16800279 bytes
File Modified Date===星期六 七月 16 23:16:24 +08:00 2022

三、對Exif的中文解釋

四、總結

以上就是今天要講的內容,本文簡單介紹瞭Metadata 元數據以及Exif 可交換圖像文件信息的基本知識,介紹瞭 metadata-extractor的具體用法,展示瞭png圖像元數據讀取、GPS坐標識別和定位以及視頻的元數據信息提取,而metadata-extractor提供瞭大量能使我們快速便捷地獲取元數據的方法。

到此這篇關於Java實現獲取圖片和視頻文件的Exif信息的文章就介紹到這瞭,更多相關Java獲取圖片視頻Exif信息內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: