我正在尝试拍摄图像,并通过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个错误,到目前为止我还无法跟踪。我在这里缺少什么吗?
答案 0 :(得分:1)
将流传递到FileResult
时,需要将流位置设置为0。
最重要的是,我可以看到其他一些问题(与您的问题无关,但也不是很好)
您不需要ImageSize
类。 Size
命名空间中已经有一个SixLabors.Primitives
结构,它是Image<TPixel>
类的属性。
您正在加载图像两次!您不需要这样做。使用第二个Size
中的using
属性来计算新尺寸。
您正在计算模仿类型并手动选择编码器。 Image.Load
的重载为您提供了一个out IImageFormat
参数。包含编码器,扩展名和mimetype。
我也对您的SystemLogo
类感到好奇。 Content
属性是byte[]
强烈建议您在填充该对象时在某处使用ToArray()
。如果是这样,那会增加开销,您应该尝试避免。改用流来传递数据。