EXIF(可交換圖像文件格式)是指定數碼相機和掃描儀主要使用的圖像和聲音格式的標準。 EXIF 數據包括有關捕獲的圖像文件的標記和元數據信息。元數據可能包含相機品牌、型號、快門速度、日期和時間、光圈、曝光時間、X 分辨率、Y 分辨率等信息。等等
如果您想以編程方式管理、提取、更新或刪除圖像的 EXIF 數據,那麼本文適合您。本文將介紹以下在 Java 中處理 EXIF 數據的方法:
Java 元數據操作庫

GroupDocs.Metadata for Java 是一個易於使用的元數據管理 Java API。它不僅可以從 JPG、PNG 或 WebP 等圖像中提取元數據,還可以使用不同的選項從圖像和其他文檔中添加、編輯、更新和刪除元數據。
我在本文中使用了此 API,因此請確保 下載 或通過將以下配置添加到 pom.xml 將其集成到基於 Maven 的應用程序中。
存儲庫和依賴
<repository>
<id>GroupDocsJavaAPI</id>
<name>GroupDocs Java API</name>
<url>http://repository.groupdocs.com/repo/</url>
</repository>
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-metadata</artifactId>
<version>20.5</version>
<classifier>javadoc</classifier>
</dependency>
從 Java 中的圖像中提取 EXIF 數據 - 元數據查看器
您可以按照簡單的步驟讀取 EXIF 數據屬性。讓我們從這張埃菲爾鐵塔圖片中提取 EXIF 數據開始。我選擇了一個 JPG 文件作為示例圖像,您可以使用您的任何文件,無論是 PNG、WebP、BMP、GIF 還是 TIFF。

- 使用 Metadata 類構造函數加載包含 EXIF 數據信息的圖像源文件。
- 通過調用 getRootPackage() 方法獲取其根包。
- 從根包中,通過調用 getExifPackage() 方法獲取其 EXIF 包。
- 擁有 EXIF 包後,您可以獲得圖像 EXIF 屬性,如品牌、型號、寬度、長度、日期時間等,如以下 Java 代碼示例所示。
// Extract EXIF Data Package Information from image in Java
try (Metadata metadata = new Metadata("eiffel-tower.jpg")) {
IExif root = (IExif) metadata.getRootPackage();
if (root.getExifPackage() != null) {
// Extract EXIF Package
ExifPackage exifPackage = root.getExifPackage();
System.out.println("Make : " + exifPackage.getMake());
System.out.println("Model : " + exifPackage.getModel());
System.out.println("Width : " + exifPackage.getImageWidth());
System.out.println("Length : " + exifPackage.getImageLength());
System.out.println("DateTime : " + exifPackage.getDateTime());
}
}
這是您將通過上述代碼獲得的 EXIF 信息。
Make : NIKON CORPORATION
Model : NIKON D3000
Width : 640
Length : 424
DateTime : 2014:08:09 10:35:13
如需進一步的 IFD(圖像文件目錄)和 GPS(全球定位系統)包信息,您只需調用 EXIF 包的相應方法,即 getExifIfdPackage() 或 getGpsPackage()。從這些包中,您可以提取更多信息,例如;
- 圖像捕獲設備序列號
- 相機所有者姓名
- 用戶評論
- 高度
- 緯度
- 經度
- 等等
這是您可以在上述方法中添加的代碼,用於顯示 EXIF 數據以及 IFD 和 GPS 信息。
// EXIF IFD Package
ExifIfdPackage exifIfdPackage = exifPackage.getExifIfdPackage();
System.out.println("BodySerialNumber : " + exifIfdPackage.getBodySerialNumber());
System.out.println("CameraOwnerName : " + exifIfdPackage.getCameraOwnerName());
System.out.println("UserComment : " + exifIfdPackage.getUserComment());
// EXIF GPS Information Package
ExifGpsPackage exifGpsPackage = exifPackage.getGpsPackage();
System.out.println("getAltitude : " + exifGpsPackage.getAltitude());
System.out.println("Latitude Ref : " + exifGpsPackage.getLatitudeRef());
System.out.println("LongitudeRef : " + exifGpsPackage.getLongitudeRef());
使用 Java 讀取圖像的所有 EXIF 標籤
如果您想顯示或提取任何圖像或文件的所有 EXIF 屬性,您可以按照與上述示例類似的步驟進行:
- 只需使用 Metadata 構造函數加載文件。
- 通過調用方法 getRootPackage() 獲取 EXIF 根包。
- 通過調用 getExifPackage() 方法獲取 EXIF 包。
- 遍歷 EXIF 包以獲得所需的名稱-值對。
- 同樣,獲取 IFD 和 GPS 包並顯示其鍵和值。
try (Metadata metadata = new Metadata("eiffel-tower.jpg")) {
IExif root = (IExif) metadata.getRootPackage();
if (root.getExifPackage() != null) {
String pattern = "%s = %s";
// Reading all EXIF tags.
for (TiffTag tag : root.getExifPackage().toList()) {
System.out.println(String.format(pattern, tag.getName(), tag.getValue()));
}
// Extract all EXIF IFD tags.
for (TiffTag tag : root.getExifPackage().getExifIfdPackage().toList()) {
System.out.println(String.format(pattern, tag.getName(), tag.getValue()));
}
// Extract all EXIF GPS tags
for (TiffTag tag : root.getExifPackage().getGpsPackage().toList()) {
System.out.println(String.format(pattern, tag.getName(), tag.getValue()));
}
}
}
在 Java 中更新 EXIF 屬性
您甚至可以輕鬆更改任何圖像或任何文檔的現有 EXIF 數據。步驟很簡單:
更新 EXIF 包
- 通過調用 getExifPackage() 方法獲取 EXIF 包。
- 使用像這樣的setter方法;
- 同樣,您可以設置藝術家、品牌、型號、軟件、圖像寬度和高度、日期、時間等的值。
更新 EXIF IFD 包
就像更新 EXIF 包一樣,您可以更新 EXIF IFD 和 GPS 包的屬性。請訪問 ExifIfdPackage 或 ExifGpsPackage 類,了解您可以為您的寶貴圖像和文檔定制多少。
// Update/Set new values in EXIF Data (EXIF Package and EXIF IFD Package).
try (Metadata metadata = new Metadata("eiffel-tower.jpg")) {
IExif root = (IExif) metadata.getRootPackage();
// Set the EXIF package if it's missing
if (root.getExifPackage() == null) {
root.setExifPackage(new ExifPackage());
}
ExifPackage exifPackage = root.getExifPackage();
// Setting the desired values in EXIF Package and EXIF IFD Package.
exifPackage.setCopyright("Copyright (C) 2011-2020 GroupDocs. All Rights Reserved.");
exifPackage.setImageDescription("Eiffel Tower for EXIF");
exifPackage.setSoftware("GroupDocs.Metadata");
exifPackage.getExifIfdPackage().setBodySerialNumber("GD-2020");
exifPackage.getExifIfdPackage().setCameraOwnerName("GroupDocs");
exifPackage.getExifIfdPackage().setUserComment("Nice image captured in 2014");
metadata.save("eiffel-tower-updated.jpg");
}
從 Java 中的圖像中刪除 EXIF 元數據
如果您想從任何文件中刪除 EXIF 包,這非常簡單,只需通過調用根包的 setExifPackage(null) 將其 EXIF 包設置為 null 即可。
// Removing the EXIF data from an image.
try (Metadata metadata = new Metadata("eiffel-tower.jpg")) {
IExif root = (IExif) metadata.getRootPackage();
root.setExifPackage(null);
metadata.save("eiffel-tower-no-exif.jpg");
}
支持的圖像和其他格式
以下是 GroupDocs.Metadata 當前支持的文件格式。您可以隨時訪問 文檔 以獲取更新信息。
文件類型 | 文件格式 |
---|---|
圖片 | BMP、GIF、JPG、JPEG、JPE、JP2、PNG、DJVU、DWG、DXF、WebP、TIFF、PSD、EMF、WMF |
音視頻 | MP3、WAV、AVI、MOV/QT、FLV、ASF、DICOM |
查看有關 GroupDocs.Metadata 的更多信息
讓我們多談談@免費支持論壇。