Попытка вернуть изображение с помощью действия контроллера MVC после использования изменения размера ImageSharp - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь взять изображение, изменить его размер с помощью ImageSharp с помощью image.Mutate, сохранить его в поток и вернуть изображение в виде файла через контроллер mvc клиенту Angular. Это мой код, который я использую для изменения изображения:

    public static MemoryStream ImageResizeStream(byte[] data, int maxHeight, int maxWidth, bool keepIfLower, string extension)
    {
        var size = new ImageSize();
        using (var image = Image.Load(data))
        {
            size.Height = image.Height;
            size.Width = image.Width;
        }

        ImageSize newSize = ScaleSize(size, maxWidth, maxHeight);

        var newStream = new MemoryStream();
        try
        {
            using (var image = Image.Load(data))
            {
                image.Mutate(x => x
                    .Resize(newSize.Width, newSize.Height));
                image.Save(newStream, GetImageEncoder(extension));
            }
            return newStream;
        }
        catch (Exception exception)
        {
            Console.Write(exception.Message);
        }

        return null;
    }
    public class ImageSize
    {
      public ImageSize()
      {

      }

      public ImageSize(int width, int height)
      {
          Width = width;
          Height = height;
      }
      public int Height { get; set; }
      public int Width { get; set; }
    }

И это код действия контроллера, который его использует: (AlterImage - класс, возвращающий поток)

    private FileStreamResult SetResult(SystemLogo logo)
    {
        var logoExtension = logo.FileName.Split('.').Last();

        var fileType = string.Empty;

        switch (logoExtension)
        {
            case "png":
                fileType = "image/png";
                break;
            case "jpg":
                fileType = "image/jpg";
                break;
            case "gif":
                fileType = "image/gif";
                break;
        }

        //var maxHeight = 38;
        //var maxWidth = 100;
        var newStream = AlterImage.ImageResizeStream(logo.Content, 38, 100, true, logoExtension);

        var result = File(newStream, fileType);
        return result;
    }

(я возвращаю это как результат действия)

На клиенте появляется ошибка 500, которую я пока не смог отследить. Есть что-то, чего я здесь не хватает?

1 Ответ

0 голосов
/ 03 ноября 2018

Вам необходимо установить позицию потока в 0 при передаче потока в FileResult.

Кроме того, я вижу некоторые другие проблемы (не связанные с вашей проблемой, но и не очень хорошие)

  • Вам не нужен класс ImageSize. Уже есть структура Size в пространстве имен SixLabors.Primitives, которая является свойством класса Image<TPixel>.

  • Вы загружаете изображение дважды! Вам не нужно это делать. Используйте свойство Size внутри второго using, чтобы вычислить ваши новые измерения.

  • Вы рассчитываете mimetypes и выбираете кодировщик вручную. Image.Load имеет перегрузку, которая дает вам параметр out IImageFormat. Содержит кодировщик, расширение, а также mimetype.

Мне тоже интересно узнать о вашем SystemLogo классе. То, что свойство Content является byte[], настоятельно рекомендует вам использовать ToArray() где-то при заполнении этого объекта. Если это так, это добавляет накладные расходы, вы должны попытаться избежать. Вместо этого используйте потоки для передачи данных.

...