Java 图片上传后为什么会自动旋转90度?

问题:
用户反馈上传后的图片方向不对,起初怀疑是本身图片方向有问题,但是用windows图片查看器打开图片方向是"正常"显示的?

分析:
windows默认的图片查看器已经帮我们自动旋转展示了,我们在手机横拍或者扫描仪、数码相机输出的图片通常包含此类信息,但是我们java读取的是图片的真实方向,所以在生成图片方向自然也就不对了。

收集数据:

使用红米K50手机、红米note10手机、佳能700D数据码相机、荣耀V10手机,各自拍了一张横屏和竖屏的照片,通过蓝牙的方式传输到电脑端

 然后使用 java的第三方库 解析图片的exif信息,

<!-- https://mvnrepository.com/artifact/com.drewnoakes/metadata-extractor -->
<dependency>
      <groupId>com.drewnoakes</groupId>
      <artifactId>metadata-extractor</artifactId>
      <version>2.18.0</version>
</dependency>

在图片的图片的exif信息中,过滤出方向有关的Orientation 信息,结果如下:

总结如下:

1、佳能700D数码相机,在拍摄横屏、竖屏图片是,非常详细的记录方向信息

2、红米K50手机只能记录横屏图片的方向信息...

3、红米note10手机能记录横屏图片的方向信息,竖屏的方向信息与与横屏的一样?

4、荣耀V10手机则完全无法记录横屏、竖屏的方向信息......

未完待续........

源码地址如下:

https://gitee.com/lizhou828/liz-incubator/tree/master/image/image-upload

参考文档:


Java 图片上传后发生了90度的旋转 https://blog.csdn.net/yuyu1067/article/details/116333935

图片Exif 信息中Orientation的理解和对此的处理 https://www.cnblogs.com/csonezp/p/5564809.html


前端 exif.js - Orientation 自动修正解决方案 https://blog.csdn.net/weixin_35933239/article/details/114827603
 
Windows 10进行旋转的图片,在Windows XP或Windows 7上无法识别
https://blog.csdn.net/weixin_42375011/article/details/115634704

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,图片上传后可能自动进行旋转,这是因为图片Exif信息中包含了旋转信息。解决办法可以通过以下步骤实现: 1.读取图片Exif信息,获取旋转值。 2.根据旋转值对图片进行旋转。 3.保存旋转后的图片。 以下是示例代码: ```java //读取图片Exif信息 Metadata metadata = ImageMetadataReader.readMetadata(inputStream); Directory directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class); int orientation = 1; if (directory != null && directory.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) { orientation = directory.getInt(ExifIFD0Directory.TAG_ORIENTATION); } //根据旋转值对图片进行旋转 BufferedImage bufferedImage = ImageIO.read(inputStream); if (orientation == 6) { bufferedImage = rotateImage(bufferedImage, 90); } else if (orientation == 3) { bufferedImage = rotateImage(bufferedImage, 180); } else if (orientation == 8) { bufferedImage = rotateImage(bufferedImage, 270); } //保存旋转后的图片 ImageIO.write(bufferedImage, "jpg", outputStream); ``` 其中,rotateImage为自定义函数,用于旋转图片,示例代码如下: ```java public static BufferedImage rotateImage(BufferedImage bufferedimage, int degree) { int w = bufferedimage.getWidth(); int h = bufferedimage.getHeight(); int type = bufferedimage.getColorModel().getTransparency(); BufferedImage img; Graphics2D graphics2d; (graphics2d = (img = new BufferedImage(w, h, type)).createGraphics()).setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); graphics2d.rotate(Math.toRadians(degree), w / 2, h / 2); graphics2d.drawImage(bufferedimage, 0, 0, null); graphics2d.dispose(); return img; } ``` 这样就可以解决Java上传图片自动旋转的问题了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值