使用 ImageSharp 调整大小后,尝试通过 MVC 控制器操作 return 图像
Trying to return an image via MVC controller action after using ImageSharp resizing
我正在尝试拍摄图像,通过 image.Mutate 使用 ImageSharp 调整它的大小,将其保存到流中,然后 return 通过 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 是 class returning 流)
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;
}
(我return这是操作的结果)
在客户端上,出现了 500 错误,我目前还无法跟踪。我在这里缺少什么吗?
将流传递给 FileResult
时需要将流位置设置为 0。
除此之外,我还看到了一些其他问题(与您的问题无关,但也不好)
您不需要 ImageSize
class。 SixLabors.Primitives
命名空间中已经有一个 Size
结构,它是 Image<TPixel>
class.
的 属性
您正在加载图像两次!你不需要那样做。使用第二个 using
中的 Size
属性 来计算您的新维度。
您正在计算 mime 类型并手动选择编码器。 Image.Load
有一个为您提供 out IImageFormat
参数的重载。其中包含编码器、扩展名和 mimetype。
我也对你的 SystemLogo
class 很好奇。 Content
属性 是一个 byte[]
强烈建议您在填充该对象时在某处使用 ToArray()
。如果是这样,那会增加您应该尝试避免的开销。使用流来传递数据。
我正在尝试拍摄图像,通过 image.Mutate 使用 ImageSharp 调整它的大小,将其保存到流中,然后 return 通过 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 是 class returning 流)
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;
}
(我return这是操作的结果)
在客户端上,出现了 500 错误,我目前还无法跟踪。我在这里缺少什么吗?
将流传递给 FileResult
时需要将流位置设置为 0。
除此之外,我还看到了一些其他问题(与您的问题无关,但也不好)
您不需要
ImageSize
class。SixLabors.Primitives
命名空间中已经有一个Size
结构,它是Image<TPixel>
class. 的 属性
您正在加载图像两次!你不需要那样做。使用第二个
using
中的Size
属性 来计算您的新维度。您正在计算 mime 类型并手动选择编码器。
Image.Load
有一个为您提供out IImageFormat
参数的重载。其中包含编码器、扩展名和 mimetype。
我也对你的 SystemLogo
class 很好奇。 Content
属性 是一个 byte[]
强烈建议您在填充该对象时在某处使用 ToArray()
。如果是这样,那会增加您应该尝试避免的开销。使用流来传递数据。