本帖最后由 魔鬼筋肉人 于 2022-4-7 20:10 编辑
测试图片https://dmj1.lanzoub.com/i8NY002pyfzc
golang怎么根据exif信息旋转图片正确方向呢?
真的好难搞
err = jpeg.Encode(file, dst, &jpeg.Options{80})
- 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)
- }
-
- }
复制代码 |