EXIF(Exchangeable Image File Format) 是指定数码相机和扫描仪主要使用的图像和声音格式的标准。 EXIF 数据包括有关捕获的图像文件的标记和元数据信息。元数据可能包含相机制造商、型号、快门速度、日期和时间、光圈、曝光时间、X 分辨率、Y 分辨率等信息。等等
如果您想以编程方式管理、提取、更新或删除图像的 EXIF 数据,那么本文适合您。本文将介绍以下在 Java 中处理 EXIF 数据的方法:
Java 元数据操作库
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。
- 使用 Metadata 类构造函数加载包含 EXIF 数据信息的图像源文件。
- 通过调用 getRootPackage() 方法获取它的根包。
- 从根包中,通过调用 getExifPackage() 方法获取其EXIF 包。
- 获得 EXIF 包后,您可以获得图像 EXIF 属性,如 Make、Model、Width、Length、Date-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 方法,例如;
- setCopyright() - 设置更新的版权信息。
- setImageDescription() - 设置图像的描述。
- 同样,您可以设置艺术家、品牌、型号、软件、图像宽度和高度、日期、时间等的值。
更新 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 的更多信息
让我们多谈谈@ 免费支持论坛。