如何将Magick.net LosslessCompress与Stream和IFormFile一起使用

时间:2019-08-06 18:23:46

标签: c# imagemagick iformfile

我正在尝试使用Magick.NET库压缩图像的质量/大小(通常为5-30左右),我无法真正理解如何使用 ImageOptimizer 类并调用使用流的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;
}

1 个答案:

答案 0 :(得分:5)

您不能使用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;
}