我有一个网络应用程序,用户可以通过手机直接拍照上传个人资料照片。由于图像的 EXIF 方向,前端必须在显示图片之前对图像进行转换(旋转/翻转)。但是,我希望在保存图片之前在后端执行转换,以避免在前端进行转换。后端是用 c# 编写的 .net core 2.0 应用程序。
有没有人对可用于访问 EXIF 数据并进行转换的库有建议。
到目前为止,我已经找到了https://github.com/SixLabors/ImageSharp并浏览了它关于如何使用它的文档。
我有一个网络应用程序,用户可以通过手机直接拍照上传个人资料照片。由于图像的 EXIF 方向,前端必须在显示图片之前对图像进行转换(旋转/翻转)。但是,我希望在保存图片之前在后端执行转换,以避免在前端进行转换。后端是用 c# 编写的 .net core 2.0 应用程序。
有没有人对可用于访问 EXIF 数据并进行转换的库有建议。
到目前为止,我已经找到了https://github.com/SixLabors/ImageSharp并浏览了它关于如何使用它的文档。
ImageSharp 库中已经有一种方法。AutoOrient()
为您处理一切。
private byte[] TransformAvatarIfNeeded(byte[] imageInBytes)
{
using (var image = Image.Load(imageInBytes, out var imageFormat ))
{
image.Mutate(x => x.AutoOrient());
return ImageToByteArray(image, imageFormat);
}
}
最后,我让它与 ImageSharp 库一起工作。它可能对其他人有帮助。
private byte[] TransformAvatarIfNeeded(byte[] imageInBytes)
{
using (var image = Image.Load(imageInBytes))
{
ExifValue exifOrientation = image.MetaData?.ExifProfile?.GetValue(ExifTag.Orientation);
if (exifOrientation == null) return imageInBytes;
RotateMode rotateMode;
FlipMode flipMode;
SetRotateFlipMode(exifOrientation, out rotateMode, out flipMode);
image.Mutate(x => x.RotateFlip(rotateMode, flipMode));
image.MetaData.ExifProfile.SetValue(ExifTag.Orientation, (ushort)1);
var imageFormat = Image.DetectFormat(imageInBytes);
return ImageToByteArray(image, imageFormat);
}
}
private byte[] ImageToByteArray(Image<Rgba32> image, IImageFormat imageFormat)
{
using (var ms = new MemoryStream())
{
image.Save(ms, imageFormat);
return ms.ToArray();
}
}
private void SetRotateFlipMode(ExifValue exifOrientation, out RotateMode rotateMode, out FlipMode flipMode)
{
var orientation = exifOrientation.Value.ToString();
switch (orientation)
{
case "2":
rotateMode = RotateMode.None;
flipMode = FlipMode.Horizontal;
break;
case "3":
rotateMode = RotateMode.Rotate180;
flipMode = FlipMode.None;
break;
case "4":
rotateMode = RotateMode.Rotate180;
flipMode = FlipMode.Horizontal;
break;
case "5":
rotateMode = RotateMode.Rotate90;
flipMode = FlipMode.Horizontal;
break;
case "6":
rotateMode = RotateMode.Rotate90;
flipMode = FlipMode.None;
break;
case "7":
rotateMode = RotateMode.Rotate90;
flipMode = FlipMode.Vertical;
break;
case "8":
rotateMode = RotateMode.Rotate270;
flipMode = FlipMode.None;
break;
default:
rotateMode = RotateMode.None;
flipMode = FlipMode.None;
break;
}