Images for .NET, in pure C#. Nothing else to install.
OneImage is an image library written from the ground up in C#, with no dependency beyond .NET itself. One line for a thumbnail, crop or conversion; underneath, a lazy engine that loads, edits and renders a tile at a time.
dotnet add package RecursiveAI.OneImageA thumbnail is one line. Nothing is decoded until you save.
using OneImage; // 400 px wide, upright, sRGB, EXIF and GPS removed, saved as WebP. Image.Thumbnail("in.jpg", 400).Save("thumb.webp"); // Load, edit, save. The format follows the extension. Image.Load("in.jpg") .Resize(width: 1200) .Rotate(90) .Save("out.png");
Lazy, tiled, streaming
Operations record what to do; pixels are computed tile by tile on save. A 24 MP photo becomes a thumbnail without being held at full size, and JPEGs decode at 1/2, 1/4 or 1/8 scale when that is enough.
Color and metadata
ICC v2 and v4 profiles, CMYK to sRGB, resampling in linear light. EXIF orientation is applied for you, and thumbnails strip GPS by default.
Safe on files you didn’t write
Parsers and decoders are bounds-checked C#. Size limits are on by default and checked from headers before anything large is allocated. Every decoder is fuzzed.
Small to ship
No native binaries, no reflection, no dynamic code. NativeAOT and trimming are supported, and you can leave out the codecs you don’t use.
Performance
Faster than ImageSharp on 27 of 29 tasks.
One task is a tie: a watermark, 4.9 ms each. One is slower: converting a CMYK JPEG to sRGB takes 1.64× as long, because OneImage applies the embedded ICC profile and ImageSharp skips it, so it is not a like-for-like comparison.
Native wrappers win some tasks. NetVips reads multi-page TIFF about 3× faster at OneImage’s default thread limit, encodes JPEG 1.58× faster and one PNG input 2.29× faster; SkiaSharp decodes GIF 2.23× faster. A JPEG thumbnail uses about 1 MiB more peak memory than ImageSharp’s.
Wall-clock time, log scale, longer is better. Bars left of 1× are slower.
Measured with BenchmarkDotNet on one shared workstation (AMD Ryzen 9 7950X3D, .NET 10). Local measurements, not promises for your hardware. Full results, memory and the method ↗
Formats
PNG
ReadAll color types, depths 1–16, interlaced, APNG.
Write8- and 16-bit, palette, APNG, levels 0–9.
JPEG
ReadBaseline, extended and progressive, 8- and 12-bit, CMYK; decode at 1/2, 1/4, 1/8 scale.
WriteBaseline or progressive, quality 1–100, gray, RGB and CMYK.
WebP
ReadLossy, lossless, alpha, animation.
WriteLossy, lossless, alpha, animation.
GIF
ReadGIF87a and 89a, animation, transparency.
WriteUp to 256 colors, dithering, frame differencing.
TIFF
ReadStrips and tiles, BigTIFF, LZW, Deflate, JPEG, CCITT G3/G4, multi-page.
WriteUncompressed, LZW, Deflate, PackBits, multi-page, BigTIFF.
BMP and ICO
ReadBMP 1–32 bpp with RLE; ICO with BMP and PNG entries.
WriteBMP 24 and 32 bpp; ICO.
Not supported
HEIC, AVIF, JPEG XL, JPEG 2000, PSD, camera RAW, PDF and SVG. Lossless and hierarchical JPEG are not read. Some TIFF variants (signed and 64-bit samples, plain YCbCr, CIELab) are rejected with an error.
Formats are detected by content, not extension. If you need one of those formats, or ImageMagick’s long tail of operations, another library is the better choice; the comparison says which.