如何将 Magick.NET LosslessCompress 与 Stream 和 IFormFile 一起使用
How use Magick.NET LosslessCompress with Stream and IFormFile
我正在尝试使用 Magick.NET 库压缩图像(通常约为 5-30)质量/大小,但我真的不明白如何使用 ImageOptimizer class 并使用流调用 LosslessCompress() 方法。
- 我需要使用 FileStream 还是 MemoryStream?
- 我是否需要在服务器上为每个图像保存/创建一个临时文件,然后继续压缩流程? (性能?)
- 还有什么吗?
简单代码示例:
private byte[] ConvertImageToByteArray(IFormFile image)
{
byte[] result = null;
// filestream
using (var fileStream = image.OpenReadStream())
// memory stream
using (var memoryStream = new MemoryStream())
{
var before = fileStream.Length;
ImageOptimizer optimizer = new ImageOptimizer();
optimizer.LosslessCompress(fileStream); // what & how can I pass here stream?
var after = fileStream.Length;
// convert to byte[]
fileStream.CopyTo(memoryStream);
result = memoryStream.ToArray();
}
return result;
}
您不能使用 fileStream
,因为流需要既可读又可写。如果您首先将数据复制到内存流,则可以在该流中压缩图像。您的代码应更改为:
private byte[] ConvertImageToByteArray(IFormFile image)
{
byte[] result = null;
// filestream
using (var fileStream = image.OpenReadStream())
// memory stream
using (var memoryStream = new MemoryStream())
{
fileStream.CopyTo(memoryStream);
memoryStream.Position = 0; // The position needs to be reset.
var before = memoryStream.Length;
ImageOptimizer optimizer = new ImageOptimizer();
optimizer.LosslessCompress(memoryStream);
var after = memoryStream.Length;
// convert to byte[]
result = memoryStream.ToArray();
}
return result;
}
我正在尝试使用 Magick.NET 库压缩图像(通常约为 5-30)质量/大小,但我真的不明白如何使用 ImageOptimizer class 并使用流调用 LosslessCompress() 方法。
- 我需要使用 FileStream 还是 MemoryStream?
- 我是否需要在服务器上为每个图像保存/创建一个临时文件,然后继续压缩流程? (性能?)
- 还有什么吗?
简单代码示例:
private byte[] ConvertImageToByteArray(IFormFile image)
{
byte[] result = null;
// filestream
using (var fileStream = image.OpenReadStream())
// memory stream
using (var memoryStream = new MemoryStream())
{
var before = fileStream.Length;
ImageOptimizer optimizer = new ImageOptimizer();
optimizer.LosslessCompress(fileStream); // what & how can I pass here stream?
var after = fileStream.Length;
// convert to byte[]
fileStream.CopyTo(memoryStream);
result = memoryStream.ToArray();
}
return result;
}
您不能使用 fileStream
,因为流需要既可读又可写。如果您首先将数据复制到内存流,则可以在该流中压缩图像。您的代码应更改为:
private byte[] ConvertImageToByteArray(IFormFile image)
{
byte[] result = null;
// filestream
using (var fileStream = image.OpenReadStream())
// memory stream
using (var memoryStream = new MemoryStream())
{
fileStream.CopyTo(memoryStream);
memoryStream.Position = 0; // The position needs to be reset.
var before = memoryStream.Length;
ImageOptimizer optimizer = new ImageOptimizer();
optimizer.LosslessCompress(memoryStream);
var after = memoryStream.Length;
// convert to byte[]
result = memoryStream.ToArray();
}
return result;
}