EXIF(Exchangeable Image File Format) 是指定数码相机和扫描仪主要使用的图像和声音格式的标准。 EXIF 数据包括有关捕获的图像文件的标记和元数据信息。元数据可能包含相机制造商、型号、快门速度、日期和时间、光圈、曝光时间、X 分辨率、Y 分辨率等信息。等等

如果您想以编程方式管理、提取、更新或删除图像的 EXIF 数据,那么本文适合您。本文将介绍以下在 Java 中处理 EXIF 数据的方法:

Java 元数据操作库

GroupDocs 的元数据 Java API

GroupDocs.Metadata for Java 是一个易于使用的元数据管理 Java API。它不仅可以从 JPG、PNG 或 WebP 等图像中提取元数据,还可以通过不同的选项从图像和其他文档中添加、编辑、更新和删除元数据。

我在本文中使用此 API,因此请确保 下载 或将其集成到您的基于 Maven 的应用程序中,只需将以下配置添加到 pom.xml。

存储库和依赖项

<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 属性,如 MakeModelWidthLengthDate-Time 等,如图所示在下面的 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()。从这些包中,您可以提取更多信息,例如;

  • 图像采集设备序列号
  • 相机 机主姓名
  • 用户评论
  • 海拔
  • 纬度
  • 经度
  • ETC。

这是您可以在上述方法中添加的代码,以显示 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 的更多信息

让我们多谈谈@ 免费支持论坛。

相关文章