使用Java读取和修改图片的Exif信息

使用 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()
            }

后记

如有疑问或者需要交流的,可以留言或者私聊,欢迎点赞收藏!

猜你喜欢

转载自blog.csdn.net/u012960155/article/details/131248672
今日推荐