圖片上傳被旋轉,golang Exif 判斷.jepg圖片原始信息Orientation方向,並旋轉,

jepg圖片上傳後,換取的url在web的image標籤上顯示被旋轉、

實例:iphone6ps豎拍圖片原圖上傳顯示   

看圖軟件打開:

圖片爲正:

上傳後,在image標籤內顯示爲逆時針旋轉90度。

 

此問題在移動端也會出現

因此,決定再上傳文件後,由後端統一處理

解決思路:

1、使用exif工具,判斷當前圖片的Orientation值。

2、將被旋轉圖片改變其Orientation值後上傳,並兌換圖片鏈接,在各個平臺顯示。

 

Orientation參數含義:

參數 0行(未旋轉上) 0列(未旋轉左) 旋轉(方法很多)
1
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"

是翻牆後下載到本地的  

資源

 

 

 

 

發佈了23 篇原創文章 · 獲贊 22 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章