.NET binding for libvips.
This NuGet package provides a .NET binding for the libvips image processing library.
This binding passes the vips test suite cleanly with no leaks on Windows, macOS and Linux.
We have formatted docs online here:
https://kleisauke.github.io/net-vips/
Programs that use NetVips
don't manipulate images directly, instead
they create pipelines of image processing operations building on a source
image. When the end of the pipe is connected to a destination, the whole
pipeline executes at once, streaming the image in parallel from source to
destination a section at a time.
Because NetVips
is parallel, it's quick, and because it doesn't need to
keep entire images in memory, it's light. For example, the NetVips
benchmark:
Loads a large image, shrinks by 10%, sharpens, and saves again. On this test
NetVips
is around 20 times faster than Magick.NET and 3 times faster than ImageSharp.
The libvips documentation has a chapter explaining how libvips opens files which gives some more background.
You need the libvips shared library on your library search path, version 8.2 or later. There are separate NuGet packages that will contain the pre-compiled libvips binaries for the most common platforms (see this repo for details):
NuGet Package1 | |
---|---|
Windows 64-bit | |
Windows 32-bit | |
Windows ARM64 | |
Linux x64 glibc2 | |
Linux x64 musl3 | |
Linux ARM64v8 glibc2 | |
Linux ARM64v8 musl3 | |
Linux ARMv7 | |
macOS x64 | |
macOS ARM644 |
1 The version number of these NuGet packages is in sync with libvips' version number.
2 Uses glibc as the standard C library (Ubuntu, Debian, etc).
3 Uses musl as the standard C library (Alpine, Gentoo Linux, etc).
4 Requires .NET 6.0 or higher.
Then just install this package, perhaps:
Install-Package NetVips
To test your install, try this test program:
if (ModuleInitializer.VipsInitialized)
{
Console.WriteLine($"Inited libvips {NetVips.Version(0)}.{NetVips.Version(1)}.{NetVips.Version(2)}");
}
else
{
Console.WriteLine(ModuleInitializer.Exception.Message);
}
Console.ReadLine();
If NetVips was able to find the libvips shared library, you should see:
Inited libvips [VERSION_NUMBER]
However, if you see something else, NetVips was unable to initialize libvips. This can happen for a variety of reasons, even though most of the times it's because NetVips was not able to find libvips or due to x86/x64 architecture problems:
Inner exception | HRESULT | Solution |
---|---|---|
DllNotFoundException | 0x8007007E | Make sure to add the bin folder of the libvips Windows build to your PATH environment variable (if you wish to not use the separate NuGet packages). |
BadImageFormatException | 0x8007000B | Make sure when you target the AnyCPU platform the Prefer 32-bit option is unchecked. Or try to target x64 instead. |
using NetVips;
using var im = Image.NewFromFile("image.jpg");
// put im at position (100, 100) in a 3000 x 3000 pixel image,
// make the other pixels in the image by mirroring im up / down /
// left / right, see
// https://libvips.github.io/libvips/API/current/libvips-conversion.html#vips-embed
using var embed = im.Embed(100, 100, 3000, 3000, extend: Enums.Extend.Mirror);
// multiply the green (middle) band by 2, leave the other two alone
using var multiply = embed * new[] { 1, 2, 1 };
// make an image from an array constant, convolve with it
using var mask = Image.NewFromArray(new[,]
{
{-1, -1, -1},
{-1, 16, -1},
{-1, -1, -1}
}, 8);
using var convolve = multiply.Conv(mask, precision: Enums.Precision.Integer);
// finally, write the result back to a file on disk
convolve.WriteToFile("output.jpg");