使用 ImageSharp 调整大小后,尝试通过 MVC 控制器操作 return 图像

Trying to return an image via MVC controller action after using ImageSharp resizing

我正在尝试拍摄图像,通过 image.Mutate 使用 ImageSharp 调整它的大小,将其保存到流中,然后 return 通过 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 是 class returning 流)

    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;
    }

(我return这是操作的结果)

在客户端上,出现了 500 错误,我目前还无法跟踪。我在这里缺少什么吗?

将流传递给 FileResult 时需要将流位置设置为 0。

除此之外,我还看到了一些其他问题(与您的问题无关,但也不好)

  • 您不需要 ImageSize class。 SixLabors.Primitives 命名空间中已经有一个 Size 结构,它是 Image<TPixel> class.

  • 的 属性
  • 您正在加载图像两次!你不需要那样做。使用第二个 using 中的 Size 属性 来计算您的新维度。

  • 您正在计算 mime 类型并手动选择编码器。 Image.Load 有一个为您提供 out IImageFormat 参数的重载。其中包含编码器、扩展名和 mimetype。

我也对你的 SystemLogo class 很好奇。 Content 属性 是一个 byte[] 强烈建议您在填充该对象时在某处使用 ToArray() 。如果是这样,那会增加您应该尝试避免的开销。使用流来传递数据。