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. 最后
欢迎各位大神的批评指正,如果大神们有更优雅的方法欢迎交流哦~