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

文章介绍了如何使用ApacheCommonsImaging库在Java中读取和修改图片的Exif信息,包括设置和修改拍摄时间。还提供了处理图片丢失Exif信息的解决方案,以及用Kotlin复制Exif数据到压缩图片的示例。
摘要由CSDN通过智能技术生成

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

后记

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

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用 Java 获取阿里云 OSS 中的图片信息,可以使用 OSS Java SDK 提供的 API,具体步骤如下: 1. 添加依赖:在 Maven 项目中,需要在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.13.1</version> </dependency> ``` 2. 初始化 OSS 客户端:在使用 SDK 前,需要先初始化 OSS 客户端。可以使用以下代码来初始化: ```java import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; // 初始化 OSS 客户端 String endpoint = "<yourEndpoint>"; String accessKeyId = "<yourAccessKeyId>"; String accessKeySecret = "<yourAccessKeySecret>"; OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); ``` 3. 获取图片信息:可以使用以下代码来获取图片信息: ```java import com.aliyun.oss.model.GetObjectMetadataRequest; import com.aliyun.oss.model.ObjectMetadata; // 获取图片信息 String bucketName = "<yourBucketName>"; String objectName = "<yourObjectName>"; GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest(bucketName, objectName); ObjectMetadata objectMetadata = ossClient.getObjectMetadata(metadataRequest); // 获取图片大小 long fileSize = objectMetadata.getContentLength(); // 获取图片类型 String contentType = objectMetadata.getContentType(); // 获取图片最后修改时间 Date lastModified = objectMetadata.getLastModified(); ``` 4. 关闭 OSS 客户端:在使用完 OSS 客户端后,需要关闭客户端以释放资源,可以使用以下代码来关闭客户端: ```java // 关闭 OSS 客户端 ossClient.shutdown(); ``` 需要注意的是,上述代码中获取图片信息的 API 只能获取图片的基本信息,无法获取图片Exif 信息。如果需要获取图片Exif 信息,可以使用第三方库,例如 Metadata Extractor。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gallonyin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值