【问题标题】:Golang some images are rotating on image uploadGolang 一些图片在图片上传时旋转
【发布时间】:2020-06-24 21:07:03
【问题描述】:

我遇到了一个相当奇怪的问题,我使用 Golang 作为后端 RESTful API,我上传图片并使用 Go 调整它们的大小。我有一个我正在测试的 I-phone 应用程序,如果我使用我的真实设备上传图像,图像会横向保存在我的 s3 帐户中。由于某种原因,调整我的图像大小正在旋转它,但是如果我从我的 Xcode IDE 上传图像,那么图像会在没有旋转的情况下正确保存。我在想也许有些东西被剥夺了但是我不知道那会是什么,我的代码是这样的

func UploadStreamImage(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
    var buff bytes.Buffer
    var result string

    wg := sync.WaitGroup{}
       print("Exoler-Streams")
    wg.Add(1)
    go func() {
        defer wg.Done()


        sess, _ := 's3 credentials'

        svc := s3.New(sess)

        file, handler, err := r.FormFile("file")
        if err != nil {
            fmt.Println("Error Uploading Image")
            return
        }
        defer file.Close()
        // resize image
        img,err := imaging.Decode(file)
        if err != nil {
            print("Imaging Open error")
        }
        new_image := imaging.Resize(img, 300, 300, imaging.Lanczos)
        var buf bytes.Buffer


        err = imaging.Encode(&buf,new_image, imaging.JPEG)
        if err != nil {
            log.Println(err)
            return
        }

        // end resize

        r := bytes.NewReader(buf.Bytes())





        read_file,err := ioutil.ReadAll(r)
        if err != nil {
            fmt.Println("Error Reading file")
               }
    // s3 specific code
        }

我正在使用的库是这个https://github.com/disintegration/imaging,我只是想从我的真实设备上传图像时有些东西被剥离,因此它弄乱了旋转。我的真机和Xcode前端的代码都是一样的。

【问题讨论】:

  • 是的,您正在剥离 exif 旋转标签。

标签: go


【解决方案1】:

图像在此过程中没有被旋转,原始图像在某些图像查看软件中以旋转模式显示,具体取决于文件 Exif 部分中的图像方向标签 (val x00112)。当您像图像包一样剥离 Exif 部分时,您会丢失该信息并且图像以标准相机方向格式(横向)显示。

【讨论】:

    【解决方案2】:

    老问题,但我想我会在这里添加一些额外的信息来帮助任何对 Exif 是什么感到困惑的人。

    当从手机上传图像时,它会保持拍摄时的方向。但是,元数据随后会添加到该图像中,并在 Orientation 键下告诉您图像的拍摄方式。然后,电话库可以使用它以正确的方式向您展示图像,您也可以。它可以是 0 - 8 之间的数字。您需要担心的唯一方向数字是 3(旋转 180)、6(旋转 270)和 8(旋转 90)。

    要获取图像的元信息,您可以使用 github.com/rwcarlsen/goexif/exif 之类的东西。这是一个关于如何从中获得轮换的sn-p。

    x, err := exif.Decode(openedFileExif)
    var rotation float64 = 0
    
        if err == nil  {
            orientationRaw, err := x.Get("Orientation")
    
            if err == nil {
                orientation := orientationRaw.String()
    
                if orientation == "3" {
                    rotation = 180
                } else if orientation == "6" {
                    rotation = 270
                } else if orientation == "8" {
                    rotation = 90
                }
            }
    
        }
    

    现在您已获得所需的旋转,您只需将图像旋转该量即可获得正常方向的图片。

    您可以为此使用github.com/disintegration/imaging 之类的东西。 UploadImage 需要是 golang image.Image

    if rotation != 0 {
                uploadedImage = imaging.Rotate(uploadedImage, rotation, color.Gray{})
            }
    

    【讨论】:

      猜你喜欢
      • 2018-10-27
      • 2017-05-25
      • 2012-12-23
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      相关资源
      最近更新 更多