登录
首页 >  Golang >  Go问答

如何在一个 io.Reader 中读取和解码 exif 数据和图像

来源:stackoverflow

时间:2024-03-18 19:39:28 329浏览 收藏

**文章首段摘要:** 本文探讨如何在 Go 应用程序中从 io.Reader 中提取 EXIF 数据和解码图像。通过使用第三方库,开发者可以读取和解析图像的元数据,例如方向信息。然而,由于 io.Reader 只能单次读取数据,开发者面临着同时获取 EXIF 数据和解码图像的挑战。为了解决这个问题,开发者可以将数据读入字节数组,然后创建新的 reader 对象,从而多次访问数据。

问题内容

我正在编写一个 go 应用程序,该应用程序使用 gqlgen 作为 graphql api。

当用户使用 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 并解码图像?

谢谢


解决方案


谢谢大家的评论。

我注意到我无法将 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))

本篇关于《如何在一个 io.Reader 中读取和解码 exif 数据和图像》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>