【发布时间】:2017-08-13 13:35:47
【问题描述】:
几周以来,我一直在研究图像上传功能,我即将完成。我使用 Golang 作为后端语言,其目的是将 IOS 设备发送的图像上传到 amazon s3 。在上传图像的过程中,我还调整了它们的大小,这导致了问题,主要是 decode 方法有时会旋转我不想要的图像
file, handler, err := r.FormFile("file")
if err != nil {
fmt.Println("Error Uploading Image")
return
}
defer file.Close()
// the code below sometimes rotates an image
img,err := imaging.Decode(file)
if err != nil {
print("Imaging Open error")
}
new_image := imaging.Resize(img,400,400, imaging.Lanczos)
我正在使用的库是https://github.com/disintegration/imaging,这太棒了,他们展示的例子就是这个
src, err := imaging.Open("testdata/lena_512.png")
if err != nil {
log.Fatalf("Open failed: %v", err)
}
src = imaging.Resize(src, 256, 0, imaging.Lanczos)
这个例子很好,但是我的图像没有存储在本地,它们来自 IOS 设备,我可以做些什么来解决这个问题?我的一些图像是这样保存的
我可以通过旋转图像来纠正它,但是其他一些未被 decode 旋转的图像最终会被 Rotate270 旋转方法。
img,err := imaging.Decode(file)
if err != nil {
print("Imaging Open error")
}
// rotate the image
img = imaging.Rotate270(img)
new_image := imaging.Resize(img,400,400, imaging.Lanczos)
这就是图像的保存方式和旋转后的样子。有没有办法我可以上传外部图像而不必使用解码或只修复解码问题? Imaging.Resize 第一个参数采用 image.Image 类型,这是我的完整代码
func myImages(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
var buff bytes.Buffer
file, handler, err := r.FormFile("file")
if err != nil {
fmt.Println("Error Uploading Image")
return
}
defer file.Close()
img,err := imaging.Decode(file)
if err != nil {
print("Imaging Open error")
}
new_image := imaging.Resize(img,400,400, imaging.Lanczos)
var buf bytes.Buffer
err = imaging.Encode(&buf,new_image, imaging.JPEG)
if err != nil {
log.Println(err)
return
}
}
【问题讨论】:
-
解码没有旋转图像,由于退出方向标签,图像最初在显示时旋转。您必须阅读该标签以确定如何旋转图像。
-
您应该检查图片中的 Exif 数据。我猜想旋转图片的不是成像。