kerpekri
kerpekri

Reputation: 377

How use Magick.NET LosslessCompress with Stream and IFormFile

I am trying to compress image(usually around 5-30) quality / size with Magick.NET library, and I cant really understand how can I use ImageOptimizer class and call LosslessCompress() method using stream.

Simple Code example:

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

Upvotes: 3

Views: 2892

Answers (1)

dlemstra
dlemstra

Reputation: 8153

You cannot use the fileStream because the stream needs to be both readable and writable. If you first copy the data to a memorystream you can then compresses the image in that stream. Your code should be changed to this:

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

Upvotes: 15

Related Questions