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