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"
是翻牆後下載到本地的
資源