我必须通过表单数据http请求接收图像并将其发送到文件存储。
但是,这个过程中出现了一个问题——如果图像是.heic格式(比如iPhone就是用这种格式拍摄的)并且是垂直的(高度>宽度),那么图像会转为水平的,即它只是侧躺着。我在其他格式上没有注意到这个问题。
我读到了 lib
github.com/rwcarlsen/goexif/exif
,它允许您获取 exif 数据,它还存储图像的方向。
这是从 Fiber 框架的 form-data 获取文件的函数:
func ParseFileToBytes(c *fiber.Ctx, fileName string) ([]byte, error) {
if c.Method() != fiber.MethodPatch {
return nil, errlst.HttpErrInvalidRequest
}
formFile, err := c.FormFile(fileName)
if err != nil { ... }
file, err := formFile.Open()
if err != nil { ... }
defer file.Close()
fileData, err := io.ReadAll(file)
if err != nil { ... }
exifData, err := exif.Decode(bytes.NewReader(fileData))
if exifData == nil {
logger.Log.Info("exifData is nil")
} else {
logger.Log.Info("exifData is not nil")
}
return fileData, nil
}
但是
“exifData is nil”
一直显示,所以我无法以任何方式确定文件最初的方向,以便调整其进一步的存储。
我将很高兴获得任何帮助!
这个库帮助了我:
https://github.com/evanoberholster/imagemeta
func rotateImage(imageData []byte, img image.Image) image.Image {
exifData, err := imagemeta.Decode(bytes.NewReader(imageData))
if err != nil {
logger.Log.Error("EXIF data is not available for this image", zap.Error(err))
} else {
orientation := exifData.Orientation.String()
logger.Log.Info("Image orientation is " + orientation)
if orientation == "Rotate 90 CW" {
img = imaging.Rotate270(img)
}
}
return img
}