0

我正在尝试拍摄图像,通过 image.Mutate 使用 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 错误,我目前还无法跟踪。我在这里缺少什么吗?

4

1 回答 1

2

将流传递给 a 时,您需要将流位置设置为 0 FileResult

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

  • 你不需要ImageSize上课。命名空间中已经有一个Size结构是类的属性。SixLabors.PrimitivesImage<TPixel>

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

  • 您正在计算 mimetypes 并手动选择编码器。Image.Load有一个重载给你一个out IImageFormat参数。它包含一个编码器、扩展和 mimetype。

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

于 2018-11-03T19:13:59.713 回答