Golang如何在不旋转的情况下上传外部图像

Rom*_*res 3 decode go

我已经开始使用图像上传功能几周了,我就完成了它.我使用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)

在此输入图像描述

Ken*_*ant 6

不幸的是,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