Asp.net mvc 尝试在使用ImageSharp调整大小后通过MVC控制器操作返回图像
我正在尝试拍摄一张图像,通过图像使用ImageSharp调整其大小。进行变异,将其保存到流中,然后通过mvc控制器将图像作为文件返回给Angular客户端。这是我用来更改图像的代码: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
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;
}