Pillow plugin for JPEG-XL, using Rust for bindings.
pip install pillow-jxl-plugin
Make sure Rust installed, then run:
git clone https://github.com/Isotr0py/pillow-jpegxl-plugin
cd pillow-jpegxl-plugin
pip install -e .[dev] -v
If you have libjxl installed and want to use dynamic link, run:
pip install -e .[dev] -v --config-settings=build-args="--features=dynamic"
ruff, while Rust code is checked with cargo fmt and cargo clippy via pre-commit.pip install -e .[dev] and then pre-commit install.pre-commit run --all-files before opening a pull request.Use import pillow_jxl to register the plugin in your code.
import pillow_jxl
from PIL import Image
# Lossless encode a png image
with Image.open("example.png") as img:
img.save("example.jxl",lossless=True)
# encode image with JPEG-Style quality
with Image.open("example.png") as img:
img.save("example.jxl", quality=98)
# Lossless construct from a jpeg image
with Image.open("example.jpg") as img:
img.save("example.jxl",lossless=True)
# Decode jxl image
with Image.open("example.jxl") as img:
display(img)
| Wheels | Windows (x86/x64) | Windows (ARM) | MacOS (x64/aarch64) | manylinux (x86/x64/aarch64) | musllinux |
|---|---|---|---|---|---|
| CP3.10 | ✔ | ❌ | ✔ | ✔ | ✔ |
| CP3.11 | ✔ | ✔ | ✔ | ✔ | ✔ |
| CP3.12 | ✔ | ✔ | ✔ | ✔ | ✔ |
| CP3.13 | ✔ | ✔ | ✔ | ✔ | ✔ |
| PyPy3.11 | ✔ | ❌ | ✔ | ✔ | ✔ |
$ claude mcp add pillow-jpegxl-plugin \
-- python -m otcore.mcp_server <graph>