Поворот ImageSharp обрезает часть изображения - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь повернуть изображение с помощью ImageSharp.

Это мой код .NET Core API:

    public async Task<IActionResult> Rotate([FromBody] PhotoRotateViewModel model)
    {
        var photo = await _photoRepository.Get(model.PhotoId);

        if (photo != null)
        {
            byte[] imageBytes;
            HttpWebRequest imageRequest = (HttpWebRequest)WebRequest.Create(photo.imageUrl);
            WebResponse imageResponse = imageRequest.GetResponse();

            Stream responseStream = imageResponse.GetResponseStream();

            using (BinaryReader br = new BinaryReader(responseStream))
            {
                imageBytes = br.ReadBytes(500000);
                br.Close();
            }
            responseStream.Close();
            imageResponse.Close();

            var rotatedImage = RotateImage(imageBytes);


        }
        return Ok();
    }

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

    private byte[] ImageToByteArray(Image<Rgba32> image, IImageFormat imageFormat)
    {
        using (var ms = new MemoryStream())
        {
            image.Save(ms, imageFormat);
            return ms.ToArray();
        }
    }

Похоже, новое изображение обрезается.

Я приложил свое исходное изображение и результат, который я получил

Оригинал:

enter image description here

повернутый:

enter image description here

Это, кажется, происходит со всеми изображениями, которые я пробовал

1 Ответ

0 голосов
/ 02 января 2019

Я посмотрел на api docs. ImageSharp и кажется, что нет проблем ни с их библиотекой, ни с вашим кодом (часть, которую вы поворачиваете изображение). Но то, что мне кажется интересным, так это то, что когда вы читаете байты, вы устанавливаете число для байтов, которые нужно прочитать. Вместо того, чтобы читать как это imageBytes = br.ReadBytes(500000);, попробуйте прочитать байты до конца потока. Для этого попробуйте код ниже.

using (BinaryReader br = new BinaryReader(responseStream))
{
        imageBytes = br.ReadBytes(int.MaxValue);
        br.Close();
}

Edit:

Чтобы справиться с нехваткой памяти и прочитать с помощью этот ответ или просто настройку br.ReadBytes(stream.Length);.

...