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

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

可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。

正文

这里我们首先引入一个 apache 出品的 jar 包
github地址:https://github.com/apache/commons-imaging
maven引入 pom中添加依赖如下:


 
     org.apache.commons
     commons-imaging
     1.0-alpha1
 

下面做一个图片文件的拍摄时间修改

    void modify_test(){
        try {
            //读文件
            File file = new File("D:\\demo.jpg");
            //获取ImageMetadata对象实例
            ImageMetadata metadata = Imaging.getMetadata(file);
            //强转为JpegImageMetadata
            JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
            //获取TiffImageMetadata
            TiffImageMetadata exif = jpegMetadata.getExif();
            //转换为Tiff的流
            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 (ImageReadException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ImageWriteException e) {
            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()
            }

本文参考文章:
https://www.freesion.com/article/8186788679/

后记

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

你可能感兴趣的:(java,图像处理)