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

时间:2018-11-02 18:40:25

标签: asp.net-mvc imagesharp

我正在尝试拍摄图像,并通过imageSharp通过imageSharp调整其大小,然后将其保存到流中,然后通过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 :(得分:1)

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

最重要的是,我可以看到其他一些问题(与您的问题无关,但也不是很好)

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

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

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

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