EXIF(可交換圖像文件格式)是指定數碼相機和掃描儀主要使用的圖像和聲音格式的標準。 EXIF 數據包括有關捕獲的圖像文件的標記和元數據信息。元數據可能包含相機品牌、型號、快門速度、日期和時間、光圈、曝光時間、X 分辨率、Y 分辨率等信息。等等

如果您想以編程方式管理、提取、更新或刪除圖像的 EXIF 數據,那麼本文適合您。本文將介紹以下在 Java 中處理 EXIF 數據的方法:

Java 元數據操作庫

GroupDocs 的元數據 Java API

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。

EXIF 數據的埃菲爾鐵塔圖片
  • 使用 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 包的屬性。請訪問 ExifIfdPackageExifGpsPackage 類,了解您可以為您的寶貴圖像和文檔定制多少。

// 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 的更多信息

讓我們多談談@免費支持論壇。

相關文章