jepg图片上传后,换取的url在web的image标签上显示被旋转、
实例:iphone6ps竖拍图片原图上传显示
看图软件打开:
图片为正:

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

此问题在移动端也会出现
因此,决定再上传文件后,由后端统一处理
解决思路:
1、使用exif工具,判断当前图片的Orientation值。
2、将被旋转图片改变其Orientation值后上传,并兑换图片链接,在各个平台显示。
Orientation参数含义:
| 参数 | 0行(未旋转上) | 0列(未旋转左) | 旋转(方法很多) |
| 1 | 上 | 左 | 0° |
| 2 | 上 | 右 | 水平翻转 |
| 3 | 下 | 右 | 180° |
| 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"
是翻墙后下载到本地的
资源
本文介绍了如何解决JPEG图片上传后在Web上显示被旋转的问题。通过在Golang后端利用Exif数据判断图片的Orientation属性,针对不同情况执行旋转操作,确保图片在各平台正确显示。
711





