PictureSharp.Jxl
0.8.0
See the version list below for details.
dotnet add package PictureSharp.Jxl --version 0.8.0
NuGet\Install-Package PictureSharp.Jxl -Version 0.8.0
<PackageReference Include="PictureSharp.Jxl" Version="0.8.0" />
<PackageVersion Include="PictureSharp.Jxl" Version="0.8.0" />
<PackageReference Include="PictureSharp.Jxl" />
paket add PictureSharp.Jxl --version 0.8.0
#r "nuget: PictureSharp.Jxl, 0.8.0"
#:package PictureSharp.Jxl@0.8.0
#addin nuget:?package=PictureSharp.Jxl&version=0.8.0
#tool nuget:?package=PictureSharp.Jxl&version=0.8.0
PictureSharp.Jxl
JPEG XL for PictureSharp, in pure C# with no native dependencies. Requires .NET 10+ and PictureSharp 0.9.0+.
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. See what changed in 0.7.8.
Support
- Read: still images as
cjxlproduces them: lossy (VarDCT) and lossless (Modular), recompressed JPEGs, progressive files, patches; RGB and grayscale with alpha, up to 16 bits per sample (Rgba64withPreserveBitDepth, otherwise reduced to 8). - Write: lossy VarDCT with
Quality/DistanceandEffort1–9, about as small ascjxlat the same settings (patches included); lossless 8-bit or 16-bit gray or RGB with alpha, about as small ascjxl -d 0 -e 7. - Metadata: ICC, EXIF, XMP (also Brotli-compressed), colour description and orientation; read, written and edited in place (editing files with JPEG reconstruction data is unsupported).
- JPEG transcoding:
JxlTranscoder.FromJpegstores sequential or progressive 8-bit Huffman JPEG (gray or YCbCr 4:4:4/4:2:2/4:2:0);ToJpegreconstructs the original JPEG byte for byte, including metadata. - Not supported yet: animations, layers, photon noise and splines, float samples, CMYK
(
NotSupportedException); writing animations; transcoding RGB, CMYK/YCCK, arithmetic or 12-bit JPEG.
Pixels match djxl (libjxl 0.12.0): lossless images exactly, lossy ones within 1 of 255 in a few samples. Files this package writes decode with djxl the same way.
Version 0.8.0 adds SIMD kernels (AVX2 with FMA, SSE4.1, scalar fallback) with byte-identical results to 0.7.10:
on an AVX2 CPU, VarDCT decoding is 2.8–3.8× and lossy encoding 1.4–2.6× faster, single-threaded. Native AOT
applications get the AVX2/FMA kernels only when published with -p:IlcInstructionSet=x86-64-v3 (or native).
See the release notes and speed measurements.
Status: early development (0.8.0). 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
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 | Versions 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. |
-
net10.0
- PictureSharp (>= 0.9.0)
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 | 101 | 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 | 102 | 10/31/2026 |
| 0.8.8 | 103 | 10/31/2026 |
| 0.8.7 | 95 | 10/30/2026 |
| 0.8.6 | 91 | 10/30/2026 |
| 0.8.5 | 91 | 10/30/2026 |
| 0.8.4 | 89 | 10/30/2026 |
| 0.8.3 | 95 | 10/29/2026 |
| 0.8.2 | 94 | 10/29/2026 |
| 0.8.1 | 97 | 10/29/2026 |
| 0.8.0 | 102 | 10/29/2026 |
| 0.7.10 | 91 | 10/28/2026 |
| 0.7.9 | 95 | 10/28/2026 |
| 0.7.8 | 97 | 10/28/2026 |
0.8.0: SIMD (AVX2 with FMA, SSE4.1, scalar fallback) for DCT/IDCT, colour conversion, Gaborish/EPF, dequantization, pixel output and the lossy encoder. On an AVX2 CPU under JIT, single-threaded: VarDCT decode 2.8-3.8x, lossy encode 1.4x (effort 1-3) and 2.4-2.6x (effort 5-7) faster than 0.7.10; Modular and JPEG reconstruction unchanged. Encoded bytes, decoded pixels, metadata edits and JPEG reconstruction remain identical to 0.7.10. No API changes. Native AOT uses AVX2/FMA only when published with IlcInstructionSet=x86-64-v3 or native; see docs/releases/release-0.8.0.md and docs/benchmarks/speed.md.