【问题标题】:Rotate/Flip image using EXIF data of image in aspnetcore web api使用aspnetcore web api中图像的EXIF数据旋转/翻转图像
【发布时间】:2018-04-24 17:57:48
【问题描述】:

我有一个网络应用程序,用户可以通过手机直接拍照上传个人资料照片。由于图像的 EXIF 方向,前端必须在显示图片之前对图像进行转换(旋转/翻转)。但是,我希望在保存图片之前在后端执行转换,以避免在前端进行转换。后端是用 c# 编写的 .net core 2.0 应用程序。

是否有人对可用于访问 EXIF 数据并进行转换的库提出建议。

到目前为止,我已经找到了https://github.com/SixLabors/ImageSharp,并浏览了它的文档以了解如何使用它。

【问题讨论】:

  • Stack Overflow 不是在库中寻找或获得建议的地方。 FWIW,ImageSharp 是一个很好的库,所以试试吧。如果它不能满足您的所有需求,请研究其他内容。如果遇到问题,您可以就这些问题提出具体问题。

标签: c# image-processing asp.net-core asp.net-core-2.0 imagesharp


【解决方案1】:

ImageSharp 库中已经有一种方法。 AutoOrient() 为您处理一切。

Docs

private byte[] TransformAvatarIfNeeded(byte[] imageInBytes)
{
    using (var image = Image.Load(imageInBytes, out var imageFormat ))
    {
        image.Mutate(x => x.AutoOrient());
        return ImageToByteArray(image, imageFormat);
    }
}

【讨论】:

  • 你也可以菊花链Mutate函数,例如:image.Mutate(x => x.Resize(width, height).AutoOrient());
  • 文档链接已损坏
  • 已修复。代码没有改变
【解决方案2】:

最后,我让它与 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;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2015-07-20
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    相关资源
    最近更新 更多