C# 如何使用Magick.NET无损压缩与流和文件

C# 如何使用Magick.NET无损压缩与流和文件,c#,imagemagick,iformfile,C#,Imagemagick,Iformfile,我试图用library压缩图像(通常在5-30左右)的质量/大小,但我真的不明白如何使用ImageOptimizer类并使用stream调用LosslesCompress()方法 我需要使用FileStream还是MemoryStream 我是否需要在服务器上为每个映像保存/创建一个临时文件,然后继续压缩流程?(性能?) 还有别的吗 简单代码示例: private byte[]ConvertImageToByteArray(文件映像) { 字节[]结果=空; //文件流 使用(var fil

我试图用library压缩图像(通常在5-30左右)的质量/大小,但我真的不明白如何使用ImageOptimizer类并使用stream调用LosslesCompress()方法

  • 我需要使用FileStream还是MemoryStream
  • 我是否需要在服务器上为每个映像保存/创建一个临时文件,然后继续压缩流程?(性能?)
  • 还有别的吗
简单代码示例:

private byte[]ConvertImageToByteArray(文件映像)
{
字节[]结果=空;
//文件流
使用(var fileStream=image.OpenReadStream())
//内存流
使用(var memoryStream=new memoryStream())
{
var before=fileStream.Length;
ImageOptimizer optimizer=新的ImageOptimizer();
optimizer.LosslessCompress(fileStream);//我可以在这里传递什么&如何传递流?
var after=fileStream.Length;
//转换为字节[]
CopyTo(memoryStream);
结果=memoryStream.ToArray();
}
返回结果;
}

您不能使用
文件流,因为该流需要可读写。如果首先将数据复制到memorystream,则可以压缩该流中的图像。您的代码应更改为:

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;
}

工作起来很有魅力!谢谢。