Imageflow.AllPlatforms
0.14.1
Prefix Reserved
dotnet add package Imageflow.AllPlatforms --version 0.14.1
NuGet\Install-Package Imageflow.AllPlatforms -Version 0.14.1
<PackageReference Include="Imageflow.AllPlatforms" Version="0.14.1" />
<PackageVersion Include="Imageflow.AllPlatforms" Version="0.14.1" />
<PackageReference Include="Imageflow.AllPlatforms" />
paket add Imageflow.AllPlatforms --version 0.14.1
#r "nuget: Imageflow.AllPlatforms, 0.14.1"
#addin nuget:?package=Imageflow.AllPlatforms&version=0.14.1
#tool nuget:?package=Imageflow.AllPlatforms&version=0.14.1
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 8.0 & .NET Standard 2.0 library, and as such is compatible with .NET 4.6.2+, .NET Core 2.0+, and .NET 5/6/7/8/9.
Note: We recently switched from Newtonsoft to System.Text.Json to support AOT and trimming; see CHANGES.md for details and some breaking changes. There are also new classes for attaching source image data to jobs; use MemorySource.* over ByteSource and BufferedStreamSource.* instead of StreamSource.
On .NET Core 3.x and .NET 5/6/7/8 (or if using PackageReference on .NET 4.x)
dotnet add package Imageflow.AllPlatforms
.NET 4.X: A note on PackageReference
and Any CPU
If your project uses PackageReference
and targets the Any CPU
platform, you must add <RuntimeIdentifiers>
to your .csproj
file. This is because this library contains native code, and MSBuild needs to know which native assets to use for the ambiguous Any CPU
target.
Without this, you may see an error like Your project file doesn't list 'win' as a "RuntimeIdentifier"
.
Add the following to your project's primary <PropertyGroup>
:
<RuntimeIdentifiers>win;win-x64;win-x86</RuntimeIdentifiers>
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 Imageflow.NativeRuntime.win-x86 -pre
PM> Install-Package Imageflow.NativeRuntime.win-x86_64 -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).
License
- 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 https://imageresizing.net/pricing
- 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.
Examples
Getting image dimensions and format
using Imageflow.Fluent;
public async void TestGetImageInfo()
{
var imageBytes = Convert.FromBase64String(
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEX/TQBcNTh/AAAAAXRSTlPM0jRW/QAAAApJREFUeJxjYgAAAAYAAzY3fKgAAAAASUVORK5CYII=");
var info = await ImageJob.GetImageInfo(new MemorySource(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(
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEX/TQBcNTh/AAAAAXRSTlPM0jRW/QAAAApJREFUeJxjYgAAAAYAAzY3fKgAAAAASUVORK5CYII=");
using (var b = new ImageJob())
{
var r = await b.Decode(imageBytes)
.FlipVertical()
.FlipHorizontal()
.Rotate90()
.Rotate180()
.Rotate270()
.Transpose()
.CropWhitespace(80, 0.5f)
.Distort(30, 20)
.Crop(0,0,10,10)
.Region(-5,-5,10,10, AnyColor.Black)
.RegionPercent(-10f, -10f, 110f, 110f, AnyColor.Transparent)
.BrightnessSrgb(-1f)
.ContrastSrgb(1f)
.SaturationSrgb(1f)
.WhiteBalanceSrgb(80)
.ColorFilterSrgb(ColorFilterSrgb.Invert)
.ColorFilterSrgb(ColorFilterSrgb.Sepia)
.ColorFilterSrgb(ColorFilterSrgb.Grayscale_Bt709)
.ColorFilterSrgb(ColorFilterSrgb.Grayscale_Flat)
.ColorFilterSrgb(ColorFilterSrgb.Grayscale_Ntsc)
.ColorFilterSrgb(ColorFilterSrgb.Grayscale_Ry)
.ExpandCanvas(5,5,5,5,AnyColor.FromHexSrgb("FFEECCFF"))
.FillRectangle(2,2,8,8, AnyColor.Black)
.ResizerCommands("width=10&height=10&mode=crop")
.ConstrainWithin(5, 5)
.Watermark(new BytesSource(imageBytes),
new WatermarkOptions()
.SetMarginsLayout(
new WatermarkMargins(WatermarkAlign.Image, 1,1,1,1),
WatermarkConstraintMode.Within,
new ConstraintGravity(90,90))
.SetOpacity(0.5f)
.SetHints(new ResampleHints().SetSharpen(15f, SharpenWhen.Always))
.SetMinCanvasSize(1,1))
.EncodeToBytes(new MozJpegEncoder(80,true))
.Finish().InProcessAsync();
Assert.Equal(5, r.First.Width);
Assert.True(r.First.TryGetBytes().HasValue);
}
}
Generate multiple versions of one image
using Imageflow.Fluent;
public async Task TestMultipleOutputs()
{
var imageBytes = Convert.FromBase64String("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEX/TQBcNTh/AAAAAXRSTlPM0jRW/QAAAApJREFUeJxjYgAAAAYAAzY3fKgAAAAASUVORK5CYII=");
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())
.Finish().InProcessAsync();
Assert.Equal(60, r.TryGet(1).Width);
Assert.Equal(30, r.TryGet(2).Width);
Assert.Equal(120, r.TryGet(3).Width);
Assert.True(r.First.TryGetBytes().HasValue);
}
}
Edit images using a command string
using Imageflow.Fluent;
public async Task TestBuildCommandString()
{
var imageBytes = Convert.FromBase64String(
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEX/TQBcNTh/AAAAAXRSTlPM0jRW/QAAAApJREFUeJxjYgAAAAYAAzY3fKgAAAAASUVORK5CYII=");
// We wrap the job in a using() statement to free memory faster
using (var b = new ImageJob())
{
var r = await b.BuildCommandString(
new MemorySource(imageBytes), // or new StreamSource(Stream stream, bool disposeStream)
new BytesDestination(), // or new StreamDestination
"width=3&height=2&mode=stretch&scale=both&format=webp&webp.quality=80")
.Finish().InProcessAsync();
Assert.Equal(3, r.First.Width);
Assert.Equal("webp", r.First.PreferredExtension);
Assert.True(r.First.TryGetBytes().HasValue);
}
}
More examples are in the tests
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Imageflow.NativeRuntime.All (>= 2.1.1-rc10)
- Imageflow.Net (>= 0.14.1)
-
net8.0
- Imageflow.NativeRuntime.All (>= 2.1.1-rc10)
- Imageflow.Net (>= 0.14.1)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on Imageflow.AllPlatforms:
Package | Downloads |
---|---|
Ewl
The Enterprise Web Library (EWL), together with its tailored infrastructure platform, is a highly opinionated foundation for web-based enterprise software. |
|
Imageflow.Server
Imageflow.Server - Middleware for fetching, processing, and caching images on-demand. Commercial licenses available. |
|
BaDaBoom
RAD Framework for the IAM stack |
GitHub repositories (2)
Showing the top 2 popular GitHub repositories that depend on Imageflow.AllPlatforms:
Repository | Stars |
---|---|
imazen/resizer
The official repository for ImageResizer
|
|
imazen/imageflow-server
A super-fast image server to speed up your site - deploy as a microservice, serverless, or embeddable.
|
Version | Downloads | Last Updated | |
---|---|---|---|
0.14.1 | 117 | 7/4/2025 | |
0.14.0-rc01 | 244 | 2/7/2025 | |
0.13.2 | 70,075 | 5/15/2024 | |
0.13.1 | 24,651 | 3/9/2024 | |
0.13.0 | 313 | 3/8/2024 | |
0.12.0 | 65,013 | 2/6/2024 | |
0.11.2 | 2,584 | 1/29/2024 | |
0.11.1 | 140 | 1/29/2024 | |
0.11.0 | 142 | 1/29/2024 | |
0.10.2 | 143,605 | 9/26/2023 | |
0.10.0 | 41,553 | 4/4/2023 | |
0.9.1 | 81,815 | 1/6/2023 | |
0.9.0 | 21,649 | 9/30/2022 | |
0.8.5 | 8,116 | 8/26/2022 | |
0.8.4 | 2,560 | 8/7/2022 | |
0.8.3 | 26,638 | 8/4/2022 | |
0.8.2 | 24,279 | 6/9/2022 | |
0.8.1 | 7,043 | 5/21/2022 | |
0.8.0 | 610 | 5/20/2022 | |
0.7.31 | 1,123 | 5/19/2022 | |
0.7.24 | 232,085 | 3/29/2021 | |
0.7.23 | 1,824 | 3/18/2021 | |
0.7.22 | 7,739 | 3/18/2021 |