Java 获取图片文件宽高信息有误

文章讲述了在Java中,当上传经过旋转的图片时,使用ImageIO获取的宽高信息不准确。通过使用MetadataExtractor库获取图片元数据中的orientation信息,可以判断并修正宽高值。作者寻求了针对旋转图片更优雅方法的交流和建议。
摘要由CSDN通过智能技术生成

1. 需求背景

在上传文件时获取图片的宽高信息存储到表里

2. 原代码

直接使用Java提供的工具类获取,正常情况下都没什么问题

import javax.imageio.ImageIO;

BufferedImage image = ImageIO.read(new FileInputStream(file));
int width = image.getWidth();
int height = image.getHeight();

3. 问题出现

准备一张图片,右击图片,点击向左旋转或者向右旋转,之后再上传这张图片,获取的宽高是未旋转之前的,是错误的

4. 解决

通过获取图片元数据中的orientation(方向)信息来判断获取的宽高是否正确

依赖:

<dependency>
  <groupId>com.drewnoakes</groupId>
  <artifactId>metadata-extractor</artifactId>
  <version>2.18.0</version>
</dependency>

代码

//获取宽高
BufferedImage image = ImageIO.read(new FileInputStream(file));
int width = image.getWidth();
int height = image.getHeight();

//获取元数据
Metadata metadata = ImageMetadataReader.readMetadata(file);
ExifIFD0Directory exifIFD0Directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
//判断有无Exif(图像文件格式)信息,发生旋转都会有这个信息
Optional.ofNullable(exifIFD0Directory).ifPresentOrElse(
    exif -> {
    //筛选出方向信息
    List<Tag> tags = exif.getTags().stream().filter(tag -> tag.getTagType() == ExifIFD0Directory.TAG_ORIENTATION).toList();
    //旋转90度和270度的需要调换宽高
    if (tags.get(0).getDescription().contains("90") || tags.get(0).getDescription().contains("270")) {
        //在此处调换宽高信息
    }
  },
  ()->{
    //在此处直接使用宽高信息
  }
);

5. 最后

欢迎各位大神的批评指正,如果大神们有更优雅的方法欢迎交流哦~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值