java 修改照片exif信息

参考文章:

java更改图片拍摄信息及其他Exif详细信息
Java修改图片元数据Exif信息
Commons Imaging开源网站介绍

引入类

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-imaging</artifactId>
            <version>1.0-alpha3</version>
        </dependency>

代码

package exifImage;

import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.common.ImageMetadata;
import org.apache.commons.imaging.common.RationalNumber;
import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
import org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter;
import org.apache.commons.imaging.formats.tiff.TiffImageMetadata;
import org.apache.commons.imaging.formats.tiff.constants.ExifTagConstants;
import org.apache.commons.imaging.formats.tiff.constants.GpsTagConstants;
import org.apache.commons.imaging.formats.tiff.constants.TiffDirectoryType;
import org.apache.commons.imaging.formats.tiff.constants.TiffTagConstants;
import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoAscii;
import org.apache.commons.imaging.formats.tiff.write.TiffOutputDirectory;
import org.apache.commons.imaging.formats.tiff.write.TiffOutputSet;

import java.io.*;
import java.util.Base64;

public class changeExif {
    public static void main(String[] args) {
        try {
            File file = new File("C:\\Users\\nan\\Desktop\\"+"demo.jpg");
            //获取ImageMetadata对象实例
            ImageMetadata metadata = Imaging.getMetadata(file);
            //强转为JpegImageMetadata
            JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
            //获取TiffImageMetadata
            TiffImageMetadata exif = jpegMetadata.getExif();
            //转换为Tiff的流
            TiffOutputSet out = exif.getOutputSet();

            final TiffOutputDirectory rootDirectoryt=out.getOrCreateRootDirectory();
            rootDirectoryt.removeField(TiffTagConstants.TIFF_TAG_ARTIST);
            rootDirectoryt.add(TiffTagConstants.TIFF_TAG_ARTIST,"demoName");

            //获取TiffOutputDirectory
            TiffOutputDirectory exifDirectory = out.getOrCreateExifDirectory();
            //移除相关属性
            exifDirectory.removeField(ExifTagConstants.EXIF_TAG_EXIF_VERSION);
            //这里是自己创建的类型,源码中 ExifVersion没有对应的转成ascii类型的方法
            exifDirectory.add(new TagInfoAscii(
                    "ExifVersion", 0x9000, -1,
                    TiffDirectoryType.EXIF_DIRECTORY_EXIF_IFD), "0230");


            final TiffOutputDirectory gpsDirectory = out.getOrCreateGPSDirectory();
            //修改gps经纬度
            final double longitude = -74.0; // 74 degrees W (in Degrees East)
            final double latitude = 40 + 43 / 60.0; // 40 degrees N (in Degrees// North)
            TiffOutputSet outputSet = null;
            //进去看源码后,实际和上述操作是差不多的,只是用的  TiffOutputDirectory gpsDirectory = out.getOrCreateGPSDirectory();进行操作
            out.setGPSInDegrees(longitude, latitude);




            //新建输出流保存文件
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\nan\\Desktop\\"+"demo1.jpg"));
            //写图片
            new ExifRewriter().updateExifMetadataLossless(file, bos, out);
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

改前照片信息
在这里插入图片描述

改后照片信息
在这里插入图片描述

代码解析

主要的修改代码为

            final TiffOutputDirectory rootDirectoryt=out.getOrCreateRootDirectory();
            rootDirectoryt.removeField(TiffTagConstants.TIFF_TAG_ARTIST);
            rootDirectoryt.add(TiffTagConstants.TIFF_TAG_ARTIST,"demoName");

点击add的第一个参数 TIFF_TAG_ARTIST 看源码可以看到
在这里插入图片描述
创建了一个常量。 tagInfoAscil代表录入到照片后,这个数据的字段类型。
new 里面的参数则需要查看相关文档查询,Artist的参数
在这里插入图片描述
有一些常量可能没有定义,或者和需要的字段的类型不满足的话,可以自己构造对应的常量值进行修改。

IFD对应的值如果是image 则用这个对象进行修改

TiffOutputDirectory rootDirectoryt=out.getOrCreateRootDirectory();

为GPS或者EXIF则用对应的对象进行修改。

final TiffOutputDirectory gpsDirectory = out.getOrCreateGPSDirectory();
TiffOutputDirectory exifDirectory = out.getOrCreateExifDirectory();

查看exif的软件

链接:exif查看软件
提取码:2x7c

代码 gitee源码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值