参考文章:
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