最近在使用百度图片翻译时遇到一个问题,就是图片会翻转90,经与百度沟通,发现是原始图片中有个旋转参数引起的。
于是写个demo验证一下。
// 获取元数据中的旋转方向
func getOrientation() int {
//打开图像文件
f, err := os.Open("image.jpg")
if err != nil {
log.Fatal(err)
}
defer f.Close()
// 解码 EXIF 元数据
x, err := exif.Decode(f)
if err != nil {
if err.Error() == "EOF" {
return 0
}
log.Fatal(err)
}
// 获取图片方向
orientation, err := x.Get(exif.Orientation)
if err != nil {
log.Fatalf("failed to get orientation: %v", err)
}
// 打印方向信息
fmt.Println("Orientation:", orientation)
// 根据 EXIF 方向信息获取旋转角度
// 1: 正常(0°)
// 3: 180°
// 6: 90° 顺时针
// 8: 270° 顺时针
rotateDegrees := map[int]int{
1: 0,
3: 180,
6: 90,
8: 270,
}
value, err := orientation.Int(0)
if err != nil {
log.Fatalf("failed to parse orientation value: %v", err)
}
fmt.Printf("Rotate degrees: %d\n", rotateDegrees[value])
return rotateDegrees[value]
}
// 直接旋转图片
func setRotate(angle int) {
// 打开源图像文件
startTime := time.Now()
srcImage, err := imaging.Open("image-out.jpg")
if err != nil {
log.Fatalf("failed to open image: %v", err)
}
fmt.Println(angle)
rotatedImage := imaging.Rotate(srcImage, float64(angle), image.Transparent)
// 保存旋转后的图像
err = imaging.Save(rotatedImage, "rotated_image.jpg")
if err != nil {
log.Fatalf("failed to save image: %v", err)
}
log.Println("Image rotated and saved to rotated_image.jpg", time.Since(startTime).Milliseconds())
}
�