如何从同一个 io.Reader 读取 exif 数据并解码图像

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

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

type Upload struct {
    File        io.reader
    Filename    string
    Size        int64
    ContentType string
}

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

我使用 github.com/rwcarlsen/goexif/exif 获取 exif 信息并使用 github.com/disintegration/imaging 进行轮换,但我无法打开 graphql.Upload.File 两次。它失败了 2hd 时间。

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然后解码图像,那么图像解码就会失败。

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

谢谢

bin_swnswn 回答:如何从同一个 io.Reader 读取 exif 数据并解码图像

谢谢你们的评论。

我注意到我无法将 io.Reader 转换为 io.Seeker。 出于某种原因,我认为 io.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
    }
    break
case "image/jpeg":
    if myImage,err = jpeg.Decode(bytes.NewReader(byteArray)); err != nil {
        return err
    }
    break
case "image/webp":
    if myImage,err = webpbin.Decode(bytes.NewReader(byteArray)); err != nil {
        return err
    }
    break

default:
    return errors.Errorf("unknown image mimetype %v",imgFile.ContentType)
}
metaData,err := exif.Decode(bytes.NewReader(byteArray))
本文链接:https://www.f2er.com/1098859.html

大家都在问