如何读取 exif 数据并从中解码图像 io.Reader
how to read exif data and decode the image from same io.Reader
我正在编写一个使用 gqlgen
的 go 应用程序 for 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))
我正在编写一个使用 gqlgen
的 go 应用程序 for 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))