Golang一些图像在图像上传时旋转

时间:2017-01-20 20:00:58

标签: go

我面临一个相当奇怪的问题,我使用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的前端代码完全相同。

2 个答案:

答案 0 :(得分:2)

在此过程中图像未旋转,原始图像在某些图像视图软件中以旋转模式显示,具体取决于文件Exif部分中的图像方向标记(val x00112)。剥离Exif部件时,如图像包那样,您将丢失该信息,并且图像以标准相机方向格式(横向)显示。

答案 1 :(得分:0)

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

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

要获取图像上的元信息,可以使用github.com/rwcarlsen/goexif/exif之类的东西。以下是有关如何从中获得旋转的摘要。

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图片。图片

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