使用 Java 读取和修改图片的 Exif 信息
可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
正文
这里我们首先引入一个 apache 出品的 jar 包
github地址:https://github.com/apache/commons-imaging
maven引入 pom中添加依赖如下:
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-imaging -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-imaging</artifactId>
<version>1.0-alpha1</version>
</dependency>
下面做一个图片文件的拍摄时间修改
public void modifyExifDemo() {
try {
//读文件
File file = new File("C:\\demo.jpg");
//获取ImageMetadata对象实例
ImageMetadata metadata = Imaging.getMetadata(file);
//强转为JpegImageMetadata
JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
//获取TiffImageMetadata
TiffImageMetadata exif = jpegMetadata.getExif();
//转换为流
TiffOutputSet out = exif.getOutputSet();
//获取TiffOutputDirectory
TiffOutputDirectory exifDirectory = out.getOrCreateExifDirectory();
//移除拍摄时间
exifDirectory.removeField(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL);
exifDirectory.removeField(ExifTagConstants.EXIF_TAG_DATE_TIME_DIGITIZED);
//初始化时间
//String date = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss").format(new Date());
//添加拍摄时间 格式为"yyyy:MM:dd HH:mm:ss"
exifDirectory.add(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL, "1999:01:01 01:01:01");
exifDirectory.add(ExifTagConstants.EXIF_TAG_DATE_TIME_DIGITIZED,"1999:01:01 01:01:01");
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\demo1.jpg"));
//写入新的图片
new ExifRewriter().updateExifMetadataLossless(file, bos, out);
} catch (Exception e) {
//很多图片可能读取exif出现异常为正常现象 通常无需处理
e.printStackTrace();
}
}
如果有图片压缩后导致exif丢失问题,可以使用如下代码复制原图的exif信息到压缩后的图片(kotlin)
目标:已有原图、压缩后的图(丢失了exif),生成压缩后的图带exif,代码如下
try {
val file = File("D:/原图.png")
val out = (Imaging.getMetadata(file) as JpegImageMetadata).exif.outputSet
val bos = BufferedOutputStream(FileOutputStream("D:/压缩后的图增加exif.jpg"))
ExifRewriter().updateExifMetadataLossless(File("D:/压缩后的图.jpg"), bos, out)
} catch (e: ImageReadException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
} catch (e: ImageWriteException) {
e.printStackTrace()
}
后记
如有疑问或者需要交流的,可以留言或者私聊,欢迎点赞收藏!