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

How use Magick.NET LosslessCompress with Stream and IFormFile

我正在尝试使用 Magick.NET 库压缩图像(通常约为 5-30)质量/大小,但我真的不明白如何使用 ImageOptimizer class 并使用流调用 LosslessCompress() 方法。

简单代码示例:

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