epaper-dithering
Dithering algorithms for e-paper/e-ink displays
What it is and what it does
epaper-dithering is a Python library that dithers images for e-ink and e-paper displays with limited color palettes. It wraps a Rust core to apply one of ten dithering algorithms (from simple ordered dithering to Jarvis-Judice-Ninke) across ten color schemes ranging from monochrome to 7-color Spectra displays. The library uses perceptually weighted OKLab color matching to preserve hue and includes pre-dithering adjustments for exposure, saturation, shadows, highlights, dynamic-range compression, and gamut compression.
Typical use is loading an image with pillow, calling dither_image() with a chosen color scheme and algorithm, and saving the result. The library handles RGBA compositing automatically and supports serpentine scanning to reduce directional artifacts. It targets developers building e-paper display applications who need fast, high-quality image conversion without manual color space tuning.
Use it for:
- Convert photographs for e-ink price tags or shelf displays that support 3–7 color palettes.
- Batch-process images for e-paper photo frames with grayscale or limited-color output.
- Prototype dithering results across multiple algorithms and color schemes to find the best visual match for a specific display.
- Apply tone and gamut compression to images before dithering to compensate for e-paper's limited luminance range.
- Generate monochrome or 3-color dithered previews for testing e-ink display firmware or hardware designs.
Worth the install?
AI-flagged interpretation of the facts on this page — verify before relying
Converts images to dithered output optimized for e-ink displays with limited color palettes, using compiled Rust algorithms for fast processing.
Yes, if you are building e-paper or e-ink display applications. The library is actively maintained, has no known vulnerabilities, uses a permissive MIT license, and provides a well-documented API with pre-built wheels for modern Python versions. Install friction is moderate but manageable. Not relevant for general image processing or non-display use cases.
Install
epaper-dithering on PyPI
pip
pip install epaper-ditheringuv
uv add epaper-ditheringpoetry
poetry add epaper-ditheringInstalling epaper-dithering
Before you install
Medium install friction due to compiled Rust extension requiring platform-specific wheels, but wheels are pre-built for Python 3.11–3.13 across macOS, Linux (x86_64, aarch64, armv7l), Windows, and musl systems. Active maintenance with recent release.
License in practice
MIT license permits unrestricted use, modification, and distribution in commercial and private projects with minimal obligations.
Quickstart
from epaper_dithering import dither_image, ColorScheme, DitherMode
import pillow
image = pillow.Image.open("photo.jpg")
dithered = dither_image(image, ColorScheme.BWR, mode=DitherMode.FLOYD_STEINBERG)
dithered.save("output.png")
Requires Python 3.11 or later; pillow must be installed as a runtime dependency.
Verify before relying
- Whether the ~30ms performance claim for 800×480 images holds across all supported platforms and dithering modes.
- Whether OKLab color matching actually eliminates the achromatic-attractor bug mentioned, or if this is a relative improvement.
- Exact behavior and visual quality differences across the ten dithering algorithms in practice.
Package facts
| License | MIT (permissive) |
| Python support | supports the current Python release (>=3.11) |
| Install friction | medium — platform-specific wheel |
| Runtime dependencies | 1 — pillow |
| Maintenance | actively maintained — 22 days since the last release |
| Last repo commit | |
| First released | |
| Downloads | 89,340/month — #13,669 on PyPI (30-day window, as of 2026-08-14) |
| Known vulnerabilities | none known (OSV.dev, checked 2026-08-14) |
Evidence: epaper_dithering-6.0.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl; epaper_dithering-6.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl; epaper_dithering-6.0.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl; epaper_dithering-6.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl; epaper_dithering-6.0.0-cp311-cp311-musllinux_1_2_aarch64.whl; epaper_dithering-6.0.0-cp311-cp311-musllinux_1_2_x86_64.whl; epaper_dithering-6.0.0-cp311-cp311-win_amd64.whl; epaper_dithering-6.0.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl; epaper_dithering-6.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl; epaper_dithering-6.0.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl; epaper_dithering-6.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl; epaper_dithering-6.0.0-cp312-cp312-musllinux_1_2_aarch64.whl; epaper_dithering-6.0.0-cp312-cp312-musllinux_1_2_x86_64.whl; epaper_dithering-6.0.0-cp312-cp312-win_amd64.whl; epaper_dithering-6.0.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl; epaper_dithering-6.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl; epaper_dithering-6.0.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl; epaper_dithering-6.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl; epaper_dithering-6.0.0-cp313-cp313-musllinux_1_2_aarch64.whl; epaper_dithering-6.0.0-cp313-cp313-musllinux_1_2_x86_64.whl
Keywords: epaper, eink, dithering, image-processing, display
Tags
More Graphics packages
Pillow adds image processing capabilities to…
permissive · top 100 on PyPI
fonttoolsfonttools manipulates font files in multiple…
permissive · top 1,000 on PyPI
matplotlib-inlineEnables matplotlib figures to display inline…
permissive · top 1,000 on PyPI
pymupdfPyMuPDF extracts, renders, converts, and…
agpl · top 1,000 on PyPI
pypdfium2pypdfium2 is a Python binding to PDFium that…
permissive · top 1,000 on PyPI
altairAltair is a declarative Python library for…
permissive · top 1,000 on PyPI
color-operationsApplies color-oriented image operations—gamma…
permissive · top 15,000 on PyPI
etcpakCompresses image data into GPU-friendly texture…
permissive · top 15,000 on PyPI
pixeloeConverts standard images into pixel art using…
permissive · top 15,000 on PyPI
pyoxipngpyoxipng reduces PNG file sizes through…
permissive · top 15,000 on PyPI
climageConverts images to ANSI escape code sequences…
permissive · top 15,000 on PyPI
brewer2mplProvides access to all 165 ColorBrewer2.org…
permissive · top 15,000 on PyPI
colorthiefExtracts dominant colors and color palettes…
permissive · top 15,000 on PyPI
aggdrawaggdraw provides high-quality 2D drawing for…
permissive · top 15,000 on PyPI
imgvizimgviz provides image visualization utilities…
permissive · top 15,000 on PyPI
kornia-rskornia-rs provides low-level computer vision…
permissive · top 5,000 on PyPI