图片上传被旋转,golang Exif 判断.jepg图片原始信息Orientation方向,并旋转,

本文介绍了如何解决JPEG图片上传后在Web上显示被旋转的问题。通过在Golang后端利用Exif数据判断图片的Orientation属性,针对不同情况执行旋转操作,确保图片在各平台正确显示。

jepg图片上传后,换取的url在web的image标签上显示被旋转、

实例:iphone6ps竖拍图片原图上传显示   

看图软件打开:

图片为正:

上传后,在image标签内显示为逆时针旋转90度。

 

此问题在移动端也会出现

因此,决定再上传文件后,由后端统一处理

解决思路:

1、使用exif工具,判断当前图片的Orientation值。

2、将被旋转图片改变其Orientation值后上传,并兑换图片链接,在各个平台显示。

 

Orientation参数含义:

参数0行(未旋转上)0列(未旋转左)旋转(方法很多)
1
2水平翻转
3180°
4垂直翻转
5顺时针90°+水平翻转
6顺时针90°
7顺时针90°+垂直翻转
8逆时针90°

 

package main

import (
	"bytes"
	"fmt"
	"image"
	"image/jpeg"
	"io/ioutil"
	"math"
	"os"

	"code.google.com/p/graphics-go/graphics"
	"github.com/rwcarlsen/goexif/exif"
)

// png图片没有Orientation信息
func ReadOrientation(filename string) int {
	file, err := os.Open(filename)
	if err != nil {
		fmt.Println("failed to open file, err: ", err)
		return 0
	}
	defer file.Close()

	x, err := exif.Decode(file)
	if err != nil {
		fmt.Println("failed to decode file, err: ", err)
		return 0
	}

	orientation, err := x.Get(exif.Orientation)
	if err != nil {
		fmt.Println("failed to get orientation, err: ", err)
		return 0
	}
	orientVal, err := orientation.Int(0)
	if err != nil {
		fmt.Println("failed to convert type of orientation, err: ", err)
		return 0
	}

	fmt.Println("the value of photo orientation is :", orientVal)
	return orientVal
}

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

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

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

	file, err := os.Create("newImage.jpg")
	if err != nil {
		return src, err
	}
	defer file.Close()
	err = jpeg.Encode(file, dst, &jpeg.Options{50})
	if err != nil {
		return src, err
	}

	return nil, nil
}

func main() {
	ori := ReadOrientation("bebRotated.jpg")//先读取该图片的原始方向,方向值参考上图,
	data, err := ioutil.ReadFile("bebRotated.jpg")根据方向值,旋转图片
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(ori)
	//根据图片原始信息的Orientation判断需要转多少度
	if ori == 6 {
		RotateImage(data, 90)
	}
	if ori == 3 {
		RotateImage(data, 180)
	}
	if ori == 8 {
		RotateImage(data, 270)
	}

}

 

 

其中使用到"code.google.com/p/graphics-go/graphics"

是翻墙后下载到本地的  

资源

 

 

 

 

评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值