C# 如何从图像/位图对象返回图像作为IActionResult

C# 如何从图像/位图对象返回图像作为IActionResult,c#,image,asp.net-core,C#,Image,Asp.net Core,我正在使用barcodelib库+System.Drawing.Common包生成条形码图像,该包在.Net Core中提供 我想在浏览器中将图像作为普通图像(或下载)返回给用户,但我似乎没有找到一个好方法 我所尝试的: var barcode = new Barcode().Encode(TYPE.CODE128, reference); usuing (var outputStream = new MemoryStream()) { barcode.Save(outputStrea

我正在使用barcodelib库+System.Drawing.Common包生成条形码图像,该包在.Net Core中提供

我想在浏览器中将图像作为普通图像(或下载)返回给用户,但我似乎没有找到一个好方法

我所尝试的:

var barcode = new Barcode().Encode(TYPE.CODE128, reference);
usuing (var outputStream = new MemoryStream()) 
{
    barcode.Save(outputStream, ImageFormat.Jpeg);
    outputStream.Seek(0, SeekOrigin.Begin);
    return File(outputStream, "image/jpeg");
}
这给出了一个异常,表示流已关闭


它可以通过移除使用工具来修复,但这不是很糟糕吗?这些流不在内存中吗?

使用
outputStream
上的
块删除
。在响应可以使用流之前,正在关闭/释放流

FileResult
将在流使用完毕后关闭流

var barcode = new Barcode().Encode(TYPE.CODE128, reference);
var outputStream = new MemoryStream();
barcode.Save(outputStream, ImageFormat.Jpeg);
outputStream.Seek(0, SeekOrigin.Begin);
return File(outputStream, "image/jpeg");

使用
outputStream
上的
块删除
。在响应可以使用流之前,正在关闭/释放流

FileResult
将在流使用完毕后关闭流

var barcode = new Barcode().Encode(TYPE.CODE128, reference);
var outputStream = new MemoryStream();
barcode.Save(outputStream, ImageFormat.Jpeg);
outputStream.Seek(0, SeekOrigin.Begin);
return File(outputStream, "image/jpeg");

虽然
FileResult
将关闭流,但坦率地说,我不喜欢依靠一些外部事物在我之后清理,至少在我看来,在
之外使用
块重新创建
MemoryStream
并在没有显式关闭它的情况下放手,代码看起来是错误的

有一个超负荷的
文件
接受字节数组,因此您可以使用
块将您的返回移到
之外

byte[] bytes;
using (var ms = new MemoryStream()) 
{
    var barcode = new Barcode().Encode(TYPE.CODE128, reference);
    barcode.Save(ms, ImageFormat.Jpeg);
    bytes = ms.ToArray();
}
return File(bytes, "image/jpeg");

诚然,这是一种个人偏好,但对我来说,这看起来更干净、更“正确”。

虽然
FileResult
会关闭流,坦白说,我不喜欢依靠一些外部事物在我身后清理,至少在我看来,使用
块在
之外新建一个
内存流
,然后在没有明确关闭它的情况下将其释放,代码看起来就错了

有一个超负荷的
文件
接受字节数组,因此您可以使用
块将您的返回移到
之外

byte[] bytes;
using (var ms = new MemoryStream()) 
{
    var barcode = new Barcode().Encode(TYPE.CODE128, reference);
    barcode.Save(ms, ImageFormat.Jpeg);
    bytes = ms.ToArray();
}
return File(bytes, "image/jpeg");

不可否认,这是一种个人偏好,但对我来说,这看起来更干净、更“正确”。

它确实看起来更干净,我也有点“被触发”了,因为我不能清洁自己的东西。感谢您提供的解决方案。但值得注意的是,当您这样做时,结果不再是“流式”的。然而,唯一真正的缺点是必须首先将其完全加载到内存中。考虑到您已经在使用
内存流
,这是无关紧要的。但是,如果您的流来自文件系统之类的系统,并且还没有完全加载到内存中(映像操作之类的系统需要加载到内存中),那么将流直接传递到结果会更有效。这只是需要注意的一点。它确实看起来更干净,我也有点“被触发”了,因为我不能清理自己的东西。感谢您提供的解决方案。但值得注意的是,当您这样做时,结果不再是“流式”的。然而,唯一真正的缺点是必须首先将其完全加载到内存中。考虑到您已经在使用
内存流
,这是无关紧要的。但是,如果您的流来自文件系统之类的系统,并且还没有完全加载到内存中(映像操作之类的系统需要加载到内存中),那么将流直接传递到结果会更有效。只是一些需要注意的事情。