Поверните / переверните изображение, используя данные EXIF ​​изображения в aspnetcore web api - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть веб-приложение, в которое пользователи могут загружать фотографию профиля, фотографируя ее непосредственно на мобильные телефоны. Из-за ориентации изображений в формате EXIF, перед отображением изображения клиент должен преобразовать изображение (повернуть / перевернуть). Однако я хочу выполнить преобразование в бэкэнде перед сохранением изображения, чтобы избежать преобразования в веб-интерфейсе. Backend - это приложение .net core 2.0, написанное на c #.

Есть ли у кого-нибудь предложения относительно библиотеки, которую можно использовать для доступа к данным EXIF ​​и выполнения преобразования.

На данный момент я нашел https://github.com/SixLabors/ImageSharp и изучаю документацию по его использованию.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Для этого уже есть метод в библиотеке ImageSharp. AutoOrient(), который обрабатывает все для вас.

https://sixlabors.github.io/docs/api/ImageSharp/SixLabors.ImageSharp.Processing.Transforms.AutoOrientExtensions.html

private byte[] TransformAvatarIfNeeded(byte[] imageInBytes)
{
    using (var image = Image.Load(imageInBytes, out var imageFormat ))
    {
        image.Mutate(x => x.AutoOrient());
        return ImageToByteArray(image, imageFormat);
    }
}
0 голосов
/ 26 апреля 2018

Наконец-то я начал работать с библиотекой 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;
        }
...