全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 2050|回复: 36

[疑问] golang根据exif信息旋转图片正确方向

[复制链接]
发表于 2022-4-6 17:13:32 | 显示全部楼层 |阅读模式
本帖最后由 魔鬼筋肉人 于 2022-4-7 20:10 编辑

测试图片https://dmj1.lanzoub.com/i8NY002pyfzc

golang怎么根据exif信息旋转图片正确方向呢?
真的好难搞

err = jpeg.Encode(file, dst, &jpeg.Options{80})


  1. func RotateImage(src []byte, angle int) ([]byte, error) {
  2.         var img, _, err = image.Decode(bytes.NewReader(src))
  3.         //var img, err = GetImage(src)
  4.         if err != nil {
  5.                 return src, err
  6.         }
  7.         angle = angle % 360
  8.         //弧度转换
  9.         radian := float64(angle) * math.Pi / 180.0
  10.         cos := math.Cos(float64(radian))
  11.         sin := math.Sin(radian)
  12.         //原图的宽高
  13.         w := float64(img.Bounds().Dx())
  14.         h := float64(img.Bounds().Dy())

  15.         //新图高宽
  16.         W := int((math.Max(math.Abs(float64(w*cos-h*sin)), math.Abs(w*cos+h*sin))))
  17.         H := int((math.Max(math.Abs(w*sin-h*cos), math.Abs(w*sin+h*cos))))

  18.         dst := image.NewNRGBA(image.Rect(0, 0, W, H))
  19.         err = graphics.Rotate(dst, img, &graphics.RotateOptions{radian})
  20.         if err != nil {
  21.                 return src, err
  22.         }

  23.         file, err := os.Create("newImage.jpg")
  24.         if err != nil {
  25.                 return src, err
  26.         }
  27.         defer file.Close()
  28.         err = jpeg.Encode(file, dst, &jpeg.Options{50})
  29.         if err != nil {
  30.                 return src, err
  31.         }

  32.         return nil, nil
  33. }

  34. func main() {
  35.         ori := ReadOrientation("bebRotated.jpg")//先读取该图片的原始方向,方向值参考上图,
  36.         data, err := ioutil.ReadFile("bebRotated.jpg")根据方向值,旋转图片
  37.         if err != nil {
  38.                 fmt.Println(err)
  39.                 return
  40.         }
  41.         fmt.Println(ori)
  42.         //根据图片原始信息的Orientation判断需要转多少度
  43.         if ori == 6 {
  44.                 RotateImage(data, 90)
  45.         }
  46.         if ori == 3 {
  47.                 RotateImage(data, 180)
  48.         }
  49.         if ori == 8 {
  50.                 RotateImage(data, 270)
  51.         }

  52. }

复制代码
发表于 2022-4-6 18:10:12 | 显示全部楼层
魔鬼筋肉人 发表于 2022-4-6 18:07
啊,拍下来是竖版的,导入电脑看也是竖版的

EXIF 有2个决定方向,一个是原始方向,也就是分辨率,5472*3648,还有一个是方向字段。你这图EXIF里分辨率是横的,要自己读EXIF旋转才行。
发表于 2022-4-6 17:16:03 | 显示全部楼层
没学过Golang,下一位!
 楼主| 发表于 2022-4-6 17:32:19 | 显示全部楼层
Salta 发表于 2022-4-6 17:16
没学过Golang,下一位!

好的老哥
发表于 2022-4-6 17:40:27 | 显示全部楼层
我也没学过Golang,下一位!
 楼主| 发表于 2022-4-6 17:48:12 | 显示全部楼层
HardDisker 发表于 2022-4-6 17:40
我也没学过Golang,下一位!

哈哈好的老哥
发表于 2022-4-6 17:59:52 | 显示全部楼层
你那图片EXIF里就是横的
发表于 2022-4-6 18:02:07 | 显示全部楼层
没学过Golang,但看你的代码也没有处理旋转代码
 楼主| 发表于 2022-4-6 18:07:24 | 显示全部楼层
pathletboy 发表于 2022-4-6 17:59
你那图片EXIF里就是横的

啊,拍下来是竖版的,导入电脑看也是竖版的
 楼主| 发表于 2022-4-6 18:12:06 | 显示全部楼层
pathletboy 发表于 2022-4-6 18:10
EXIF 有2个决定方向,一个是原始方向,也就是分辨率,5472*3648,还有一个是方向字段。你这图EXIF里分辨 ...

谢谢老哥 提醒 我再继续搜搜相关知识
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-5-9 09:45 , Processed in 0.081064 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表