Imageflow Dotnet

.NET wrapper for Imageflow, the image processing library for servers.
Alternatives To Imageflow Dotnet
Select To Compare


.NET Core Build status

Imageflow.NET is a .NET API for Imageflow, the fast image optimization and processing library for web servers. Imageflow focuses on security, quality, and performance - in that order. Imageflow.NET is a .NET Standard 2.0 library, and as such is compatible with .NET 4.6.2+, .NET Core 2.0+, and .NET 5/6/7.

On .NET Core 3.x and .NET 5/6/7 (or if using PackageReference on .NET 4.x)

dotnet add package Imageflow.AllPlatforms

If you're still using packages.config on .NET 4.x (such as for ASP.NET projects), you have to install Imageflow directly

PM> Install-Package Imageflow.Net
PM> Install-Package -pre
PM> Install-Package -pre
PM> Install-Package Imageflow.NativeRuntime.osx-x86_64 -pre
PM> Install-Package Imageflow.NativeRuntime.ubuntu-x86_64 -pre

Note: On .NET 4.x you must install the appropriate NativeRuntime(s) in the project you are deploying - they have to copy imageflow.dll to the output folder. They are not copied transitively.

Also note: Older versions of Windows may not have the C Runtime installed (Install 32-bit or 64-bit).


  • Imageflow is dual licensed under a commercial license and the AGPLv3.
  • Imageflow.NET is tri-licensed under a commercial license, the AGPLv3, and the Apache 2 license.
  • Imageflow.NET Server is dual licensed under a commercial license and the AGPLv3.
  • We offer commercial licenses at
  • Imageflow.NET's Apache 2 license allows for integration with non-copyleft products, as long as jobs are not actually executed (since the AGPLv3/commercial license is needed when libimageflow is linked at runtime). This can allow end-users to benefit from optional imageflow integration in products.


Getting image dimensions and format

using Imageflow.Fluent;

public async void TestGetImageInfo()
    var imageBytes = Convert.FromBase64String(

    var info = await ImageJob.GetImageInfo(new BytesSource(imageBytes));
    Assert.Equal(info.ImageWidth, 1);
    Assert.Equal(info.ImageHeight, 1);
    Assert.Equal(info.PreferredExtension, "png");
    Assert.Equal(info.PreferredMimeType, "image/png");

Edit images with the fluent API

using Imageflow.Fluent;
public async Task TestAllJob()
    var imageBytes = Convert.FromBase64String(
    using (var b = new ImageJob())
        var r = await b.Decode(imageBytes)
            .CropWhitespace(80, 0.5f)
            .Distort(30, 20)
            .Region(-5,-5,10,10, AnyColor.Black)
            .RegionPercent(-10f, -10f, 110f, 110f, AnyColor.Transparent)    
            .FillRectangle(2,2,8,8, AnyColor.Black)
            .ConstrainWithin(5, 5)
            .Watermark(new BytesSource(imageBytes), 
                new WatermarkOptions()
                        new WatermarkMargins(WatermarkAlign.Image, 1,1,1,1), 
                        new ConstraintGravity(90,90))
                    .SetHints(new ResampleHints().SetSharpen(15f, SharpenWhen.Always))
            .EncodeToBytes(new MozJpegEncoder(80,true))

        Assert.Equal(5, r.First.Width);

Generate multiple versions of one image

using Imageflow.Fluent;
public async Task TestMultipleOutputs()
    using (var b = new ImageJob())
        var r = await b.Decode(imageBytes).
            Constrain(new Constraint(ConstraintMode.Fit, 160, 120))
            .Branch(f => f.ConstrainWithin(80, 60).EncodeToBytes(new WebPLosslessEncoder()))
            .Branch(f => f.ConstrainWithin(40, 30).EncodeToBytes(new WebPLossyEncoder(50)))
            .EncodeToBytes(new LodePngEncoder())

        Assert.Equal(60, r.TryGet(1).Width);
        Assert.Equal(30, r.TryGet(2).Width);
        Assert.Equal(120, r.TryGet(3).Width);


Edit images using a command string

using Imageflow.Fluent;

public async Task TestBuildCommandString()
    var imageBytes = Convert.FromBase64String(
    // We wrap the job in a using() statement to free memory faster
    using (var b = new ImageJob())
        var r = await b.BuildCommandString(
            new BytesSource(imageBytes), // or new StreamSource(Stream stream, bool disposeStream)
            new BytesDestination(), // or new StreamDestination

        Assert.Equal(3, r.First.Width);
        Assert.Equal("webp", r.First.PreferredExtension);

More examples are in the tests

Popular Media Categories
Related Searches

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.
C Sharp
Image Optimization