我已经开始使用图像上传功能几周了,我就完成了它.我使用Golang作为后端语言,其目的是将从IOS设备发送的图像上传到amazon s3.在上传图像的过程中,我也调整了它们的大小,这引起了一些问题,主要是解码方法有时会旋转我不想要的图像
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)
Run Code Online (Sandbox Code Playgroud)
我正在使用的库是这一个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)
Run Code Online (Sandbox Code Playgroud)
那个例子很好但是我的图像没有存储在本地,它们来自IOS设备有什么我可以做的来解决这个问题吗?我的一些图像正在这样保存
我可以通过旋转图像来校正它,但是一些其他未通过解码旋转的图像最终会被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)
Run Code Online (Sandbox Code Playgroud)
这是图像保存的方式,并在旋转后查看.有没有我可以上传外部图像而不必使用解码或只是修复解码问题?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
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,go stdlib图像包不能处理标记为使用exif标签旋转的图像(就像这里在设备上颠倒的那些).关于这个的错误在这里:
https://github.com/golang/go/issues/4341
您可以在camlistore中看到处理此问题的示例,但它非常复杂:
https://camlistore.googlesource.com/camlistore/+/master/pkg/images/images.go
首先你必须解码exif选项(DecodeOpts),然后你必须检查它有哪个方向(8个可能),然后根据需要旋转.这很痛苦,目前还没有简单的解决方案.您可以使用此包来读取exif数据:
https://github.com/rwcarlsen/goexif