猿问

如何读取exif数据并从同一io解码图像。读者

我正在编写一个用于 graphQL API 的 go 应用程序。gqlgen


当用户使用api上传文件时,我将其作为一种类型graphql.Upload


type Upload struct {

    File        io.Reader

    Filename    string

    Size        int64

    ContentType string

}

我希望能够加载图像的exif数据,解码图像并根据exif方向旋转它。


我用于获取exif信息和旋转,但我无法打开两次。它失败了2hd时间。github.com/rwcarlsen/goexif/exifgithub.com/disintegration/imaginggraphql.Upload.File


func updateImage(dir string, id int, imgFile *graphql.Upload) error {

    image := dbimage.GetImagePathNoTemplate(dir, id)

    imageThumbnail := dbimage.GetImageThumbnailPathNoTemplate(dir, id)

    var myImage image2.Image

    var err error

    switch imgFile.ContentType {

    case "image/png":

        if myImage, err = png.Decode(imgFile.File); err != nil {

            return err

        }

        break

    case "image/jpeg":

        if myImage, err = jpeg.Decode(imgFile.File); err != nil {

            return err

        }

        break

    case "image/webp":

        if myImage, err = webpbin.Decode(imgFile.File); err != nil {

            return err

        }

        break


    default:

        return errors.Errorf("unknown image mimetype %v", imgFile.ContentType)

    }

   FAILS HERE:  metaData, err := exif.Decode(imgFile.File)

   ...

}

当然,如果我先提取exif,然后解码图像,那么图像解码就会失败。


我没有得到文件的完整路径,我只得到一个。我该怎么做才能获取exif并解码图像?io.Reader


谢谢


天涯尽头无女友
浏览 147回答 1
1回答

阿波罗的战车

伙计们感谢您的评论。我注意到我无法投射到.出于某种原因,我认为得到了某种我错过的倒带方法,但事实并非如此。io.Readerio.Seekerio.Reader所以我所做的是将数据读取到一个字节数组,并在需要时创建新的Reader对象:byteArray, err := ioutil.ReadAll(imgFile.File)if err != nil {    return err}switch imgFile.ContentType {case "image/png":    if myImage, err = png.Decode(bytes.NewReader(byteArray)); err != nil {        return err    }    breakcase "image/jpeg":    if myImage, err = jpeg.Decode(bytes.NewReader(byteArray)); err != nil {        return err    }    breakcase "image/webp":    if myImage, err = webpbin.Decode(bytes.NewReader(byteArray)); err != nil {        return err    }    breakdefault:    return errors.Errorf("unknown image mimetype %v", imgFile.ContentType)}metaData, err := exif.Decode(bytes.NewReader(byteArray))
随时随地看视频慕课网APP

相关分类

Go
我要回答