PictureSharp.Jxl 0.8.14

There is a newer version of this package available.
See the version list below for details.
dotnet add package PictureSharp.Jxl --version 0.8.14
                    
NuGet\Install-Package PictureSharp.Jxl -Version 0.8.14
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="PictureSharp.Jxl" Version="0.8.14" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="PictureSharp.Jxl" Version="0.8.14" />
                    
Directory.Packages.props
<PackageReference Include="PictureSharp.Jxl" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add PictureSharp.Jxl --version 0.8.14
                    
#r "nuget: PictureSharp.Jxl, 0.8.14"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package PictureSharp.Jxl@0.8.14
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=PictureSharp.Jxl&version=0.8.14
                    
Install as a Cake Addin
#tool nuget:?package=PictureSharp.Jxl&version=0.8.14
                    
Install as a Cake Tool

PictureSharp.Jxl

JPEG XL for PictureSharp, in pure C# with no native dependencies. Requires .NET 10+ and PictureSharp 0.9.1+.

Install from NuGet:

dotnet add package PictureSharp.Jxl

Usage

Register the format once, then load and save .jxl files like any other image:

using PictureSharp;
using PictureSharp.Formats.Jxl;

ImageConfiguration.Default = ImageConfiguration.Default.ToBuilder().AddFormat(new JxlFormat()).Build();

using var image = Image.Load("photo.jxl", new DecoderOptions { ApplyExifOrientation = true });
image.Mutate(x => x.Resize(1600, 0));
image.SaveAsJxl("small.jxl");

Loading keeps the ICC profile, EXIF and XMP; saving writes them back. Saving is lossy at distance 1.0 like cjxl by default; new JxlEncoderOptions { Quality = 100 } (or Distance = 0) saves losslessly. Image.EditMetadata changes the metadata without touching the frames.

To preserve an existing JPEG exactly, use the separate transcoder without loading its pixels:

JxlTranscoder.FromJpeg("original.jpg", "archived.jxl");
JxlTranscoder.ToJpeg("archived.jxl", "restored.jpg"); // byte-identical to original.jpg
// Stream and buffer overloads are also available, e.g. FromJpeg(jpegStream, jxlStream).

Keep 16-bit samples

using Image scan = Image.Load("scan.png", new DecoderOptions { PreserveBitDepth = true });
scan.SaveAsJxl("scan.jxl", new JxlEncoderOptions { Distance = 0 });

This preserves every 16-bit sample, including alpha. Default loading returns 8-bit pixels; enable PreserveBitDepth when reading the result too.

Support

Supported
Read Lossy (VarDCT) and lossless (Modular) images, including recompressed JPEGs, progressive files and patches. Layers are flattened like djxl or read one by one with JxlLayers.Load. Animations load whole or frame by frame with Image.OpenFrameReaderAsync.
Write Lossy (Quality/Distance, Effort 1–9) and lossless, 8 or 16 bits; files about as small as cjxl at the same settings. Animations are saved whole or frame by frame with Image.CreateFrameWriter.
Pixels Gray or RGB, with or without alpha, up to 16 bits per sample (Rgba64 with PreserveBitDepth, otherwise 8-bit).
Metadata ICC, EXIF, XMP, colour description and orientation: read, written and edited in place.
JPEG JxlTranscoder stores 8-bit Huffman JPEGs (gray or YCbCr) and restores them byte for byte.

Not supported yet: images with photon noise, splines, float samples or CMYK (decoding throws NotSupportedException); transcoding RGB, CMYK, arithmetic-coded or 12-bit JPEGs.

Output matches djxl (libjxl 0.12.0): lossless exactly, lossy within 1 of 255, and files written here decode the same way with djxl.

Status: early development (0.8.14). Not for production use yet; the API may change. CI runs on Linux, including a Native AOT build.

Guides: decoding · encoding · JPEG transcoding · metadata · architecture · release notes

Performance

  • SIMD: AVX2/FMA and SSE4.1 kernels with a scalar fallback; all paths produce identical output.
  • Native AOT: publish with -p:IlcInstructionSet=x86-64-v3 (or native) to get the AVX2/FMA kernels; the default target uses SSE4.1 only.
  • Threads: decoding, encoding and JPEG transcoding run independent groups in parallel. Set MaxDegreeOfParallelism (-1 = all cores, the default; 1 = single-threaded) on DecoderOptions, JxlEncoderOptions or JxlTranscoderOptions. The output does not depend on it.
  • Encoding effort: lower Effort is faster; lossless efforts 1–3 are several times faster than 7.
  • Memory: a 12 MP image needs about 180 MiB (JPEG-recompressed decode) to 860 MiB (lossless encode) at its peak, including the 48 MB output or input image.

Measurements: speed.

License

MIT. Ported libjxl sources are listed in THIRD-PARTY-NOTICES.txt.

Build

dotnet build -c Release
dotnet test -c Release
dotnet pack src/PictureSharp.Jxl -c Release --no-build -o artifacts
bash scripts/verify-package-consumer.sh
Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.8.16 110 11/2/2026
0.8.15 100 11/2/2026
0.8.14 90 11/2/2026
0.8.13 93 11/2/2026
0.8.12 91 11/2/2026
0.8.11 94 11/2/2026
0.8.10 93 11/2/2026
0.8.9 104 10/31/2026
0.8.8 104 10/31/2026
0.8.7 96 10/30/2026
0.8.6 93 10/30/2026
0.8.5 93 10/30/2026
0.8.4 90 10/30/2026
0.8.3 98 10/29/2026
0.8.2 95 10/29/2026
0.8.1 100 10/29/2026
0.8.0 103 10/29/2026
0.7.10 92 10/28/2026
0.7.9 96 10/28/2026
0.7.8 100 10/28/2026
Loading failed

0.8.14: animations are written. SaveAsJxl/ToJxl write every frame of an image with several frames, and Image.CreateFrameWriter writes frame by frame (forward only, one encoded frame and the previous canvas held). Durations in milliseconds, LoopCount as plays, each frame cropped to what changed; identical frames extend the previous one. Lossless round trips are exact, also through djxl; still images are written byte for byte as in 0.8.13. Requires PictureSharp 0.9.1. See docs/releases/release-0.8.14.md and docs/design/0.8.14-animation-encode.md.