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

dkqlctbz  于 11个月前  发布在  Go
关注(0)|答案(3)|浏览(176)

我正面临着一个相当奇怪的问题,我使用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都是一样的。

lrl1mhuk

lrl1mhuk1#

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

tv6aics1

tv6aics12#

老问题,但我想我会在这里添加一些额外的信息,以帮助任何人谁是困惑什么是Exif。
当从手机上传图像时,它会保持拍摄时的方向。然而,Meta数据会在Orientation键下添加到该图像中,以告诉您图像是以何种方式拍摄的。然后,手机库可以使用此功能向您显示图像的正确方向,您也可以。它可以是0 - 8.你需要担心的方向数只有3(旋转180),6(旋转270)和8(旋转90)。
要获取图像上的Meta信息,可以使用类似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的东西。uploadedImage需要是golang image。Image

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

odopli94

odopli943#

可能会迟到,但我最近遇到了这个问题。你可以解决这个问题,只需像这样将选项imaging.AutoOrientation(true)添加到imaging.Open函数中
imaging.Open("path.jpg",imaging.AutoOrientation(true))

相关问题