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

Asp.net mvc 尝试在使用ImageSharp调整大小后通过MVC控制器操作返回图像,asp.net-mvc,imagesharp,Asp.net Mvc,Imagesharp,我正在尝试拍摄一张图像,通过图像使用ImageSharp调整其大小。进行变异,将其保存到流中,然后通过mvc控制器将图像作为文件返回给Angular客户端。这是我用来更改图像的代码: public static MemoryStream ImageResizeStream(byte[] data, int maxHeight, int maxWidth, bool keepIfLower, string extension) { var size = new Im

我正在尝试拍摄一张图像,通过图像使用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是返回流的类)

(我将此作为行动的结果返回)


在客户机上,它得到了一个500错误,我至今无法跟踪。这里有我遗漏的东西吗

文件结果传递流时,需要将流位置设置为0

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

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

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

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


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

将流传递到
文件结果时,需要将流位置设置为0

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

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

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

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


我对你的
SystemLogo
课程也很好奇。
Content
属性是一个
byte[]
强烈建议您在填充该对象时使用
ToArray()。如果是这样的话,那就增加了你应该尽量避免的开销。改用流来传递数据。

哪一行触发了错误?您是否已将网站配置为返回错误详细信息以帮助您诊断问题?因此,截至目前,我不知道在何处触发错误。我的站点通常会捕获错误,但由于我使用映像的方式,它会绕过我用于其他所有操作的正常httpClient请求,并直接调用api方法作为映像的url。我在整个代码中设置了断点,但是实际上,在方法内部没有任何东西会给我一个异常,所以您已经完成了代码,并且直到返回之后它才失败?您是否尝试过将流位置重置为0并删除
以调试资源是否已被释放?哪一行触发错误?您是否已将网站配置为返回错误详细信息以帮助您诊断问题?因此,截至目前,我不知道在何处触发错误。我的站点通常会捕获错误,但由于我使用映像的方式,它会绕过我用于其他所有操作的正常httpClient请求,并直接调用api方法作为映像的url。我在整个代码中设置了断点,但是实际上,在方法内部没有任何东西会给我一个异常,所以您已经完成了代码,并且直到返回之后它才失败?您是否尝试过将流位置重置为0并删除
以调试资源是否已被释放?谢谢!将“流位置”设置为0就成功了。我也很感激其他的建议!因此对我的代码进行了一些更改。非常好,很高兴我能够提供帮助。如果最终的代码也得到更新,那就太好了。我也有类似的问题。谢谢!将“流位置”设置为0就成功了。我也很感激其他的建议!因此对我的代码进行了一些更改。非常好,很高兴我能够提供帮助。如果最终的代码也得到更新,那就太好了。我也有类似的问题。
    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;
    }