java更改图片拍摄信息及其他Exif详细信息

1.首先这是个很奇怪的需求,网上的案例很少,传播很广的一个案例还必须使用jdk1.5版本,更改jdk很麻烦。
2.分析了很多源码,最后找到一个apache出品的jar包,具体上没人用的jar,解决了这个问题。
在这里插入图片描述

1
2
3
4
5
6
<!-- 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>

首先引入maven工程或者下载jar包
其次抛代码,注释写的很清楚,大家看看,可以看懂的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@Test
    void test1(){
        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();
        }
    }

如有疑问或者需要交流的,可以留言或者私聊。