Skip to main content

Image Quantization Library

Project description

Github Discord PYPI Version Build Status Black License

Imagequant Python are bindings to allow using libimagequant from Python.

Libimagequant is a small, portable C library for high-quality conversion of RGBA images to 8-bit indexed-color (palette) images.

Install

From PyPI:

pip3 install imagequant

NOTE: you may require compilation tools to build the library if you system is not suitable for the precompiled wheels. On Debian / Ubuntu you can install the build dependencies with the following command:

sudo apt install build-essential python3-dev

Usage

With PIL / Pillow

from PIL import Image
import imagequant

input_image = Image.open("./example.png")
output_image = imagequant.quantize_pil_image(
    input_image,
    dithering_level=1.0,  # from 0.0 to 1.0
    max_colors=256,       # from 1 to 256
    min_quality=0,        # from 0 to 100
    max_quality=100,      # from 0 to 100
)
output_image.save("./out.png", format="PNG")

input_imageoutput_image

With Raw Data

import imagequant

# 2×2px image
IMAGE_DATA = (
    # | R | G | B | A |
    b"\xFF\x00\x00\xFF"  # red
    b"\x00\xFF\x00\xFF"  # lime
    b"\x00\x00\xFF\xFF"  # blue
    b"\xFF\xFF\xFF\xFF"  # white
)

output_image_data, output_palette = imagequant.quantize_raw_rgba_bytes(
    IMAGE_DATA,           # RGBA image data
    2, 2,                 # width, height
    dithering_level=1.0,  # from 0.0 to 1.0
    max_colors=256,       # from 1 to 256
    min_quality=0,        # from 0 to 100
    max_quality=100,      # from 0 to 100
)

# you can now encode image data and the palette in any image format...

Example output_image_data:

b'\x02\x03\x00\x01'

Example output_palette:

[0, 0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 255, 0, 255, 0, 255, 0, 0, 0, 0, ...]
# color 0      | color 1           | color 2       | color 3       | color 4   | ...

Development of the Bindings

Clone the repository and get the submodules:

git clone https://github.com/wanadev/imagequant-python.git
cd imagequant-python
git submodule init
git submodule update

Install some dependencies (preferably in a virtualenv):

pip3 install nox cffi pillow

Build the binary part of the lib:

python imagequant/libimagequant_build.py

A .so file (or a .pyd file on Windows, or a .dylib file on MacOS) shoud now be present in the imagequant/ folder. You will not need to run this command again until you change something in imagequant/libimagequant.h or in libimagequant/*.{c,h}.

To check the coding style, you can run the lint with the following command:

nox -s lint

To run the tests, use the following command:

nox -s test

License

Imagequant Python is licensed under the BSD 3 Clause. See the LICENSE file for more information.

Libimagequant is dual-licensed:

  • For Free/Libre Open Source Software it’s available under GPL v3 or later with additional copyright notices for older parts of the code.

  • For use in closed-source software, AppStore distribution, and other non-GPL uses, you can obtain a commercial license.

Read its license terms for more information.

Changelog

  • [NEXT] (changes on master that have not been released yet):

    • Nothing yet ;)

  • v1.1.1:

    • dist: Build and publish arm64 wheels for Linux and Windows (@laggykiller, #9, #10)

  • v1.1.0:

    • Added options to set minimal and target (maximal) quality (@injet-zhou, #4)

  • v1.0.5:

    • Added Python 3.12 support (@flozz)

    • Removed Python 3.7 support (@flozz)

  • v1.0.4:

    • Added Python 3.11 support

  • v1.0.3:

    • arm64 and universal2 wheels for macOS M1

    • x86 and x68_64 wheels for musl-based Linux distro (Alpine,…)

    • x86 wheels for Windows (x86_64 were already available)

  • v1.0.2: Python 3.10 support and wheels

  • v1.0.1: Fix encoding while reading the README in setup.py

  • v1.0.0: Initial release with a minimal API.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

imagequant-1.1.1.tar.gz (64.4 kB view hashes)

Uploaded Source

Built Distributions

imagequant-1.1.1-pp310-pypy310_pp73-win_amd64.whl (42.0 kB view hashes)

Uploaded PyPy Windows x86-64

imagequant-1.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (40.4 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

imagequant-1.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (41.1 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

imagequant-1.1.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (42.8 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

imagequant-1.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl (39.9 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

imagequant-1.1.1-pp39-pypy39_pp73-win_amd64.whl (42.0 kB view hashes)

Uploaded PyPy Windows x86-64

imagequant-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (40.4 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

imagequant-1.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (41.1 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

imagequant-1.1.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (42.8 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

imagequant-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl (39.9 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

imagequant-1.1.1-pp38-pypy38_pp73-win_amd64.whl (42.0 kB view hashes)

Uploaded PyPy Windows x86-64

imagequant-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (40.4 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

imagequant-1.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (41.1 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

imagequant-1.1.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (42.8 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

imagequant-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (39.9 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

imagequant-1.1.1-pp37-pypy37_pp73-win_amd64.whl (42.0 kB view hashes)

Uploaded PyPy Windows x86-64

imagequant-1.1.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (41.3 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

imagequant-1.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (41.6 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

imagequant-1.1.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (43.6 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

imagequant-1.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (39.9 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

imagequant-1.1.1-cp312-cp312-win_arm64.whl (41.0 kB view hashes)

Uploaded CPython 3.12 Windows ARM64

imagequant-1.1.1-cp312-cp312-win_amd64.whl (51.0 kB view hashes)

Uploaded CPython 3.12 Windows x86-64

imagequant-1.1.1-cp312-cp312-win32.whl (39.6 kB view hashes)

Uploaded CPython 3.12 Windows x86

imagequant-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl (200.0 kB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.1+ x86-64

imagequant-1.1.1-cp312-cp312-musllinux_1_1_i686.whl (173.9 kB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.1+ i686

imagequant-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl (189.5 kB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.1+ ARM64

imagequant-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (199.1 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

imagequant-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (188.6 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

imagequant-1.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (177.3 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

imagequant-1.1.1-cp312-cp312-macosx_11_0_arm64.whl (53.1 kB view hashes)

Uploaded CPython 3.12 macOS 11.0+ ARM64

imagequant-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl (56.4 kB view hashes)

Uploaded CPython 3.12 macOS 10.9+ x86-64

imagequant-1.1.1-cp312-cp312-macosx_10_9_universal2.whl (102.7 kB view hashes)

Uploaded CPython 3.12 macOS 10.9+ universal2 (ARM64, x86-64)

imagequant-1.1.1-cp311-cp311-win_arm64.whl (41.0 kB view hashes)

Uploaded CPython 3.11 Windows ARM64

imagequant-1.1.1-cp311-cp311-win_amd64.whl (51.0 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

imagequant-1.1.1-cp311-cp311-win32.whl (39.6 kB view hashes)

Uploaded CPython 3.11 Windows x86

imagequant-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl (199.7 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

imagequant-1.1.1-cp311-cp311-musllinux_1_1_i686.whl (173.7 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ i686

imagequant-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl (189.2 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ ARM64

imagequant-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (198.8 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

imagequant-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (188.2 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

imagequant-1.1.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (177.4 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

imagequant-1.1.1-cp311-cp311-macosx_11_0_arm64.whl (53.1 kB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

imagequant-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl (56.4 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ x86-64

imagequant-1.1.1-cp311-cp311-macosx_10_9_universal2.whl (102.7 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

imagequant-1.1.1-cp310-cp310-win_arm64.whl (41.0 kB view hashes)

Uploaded CPython 3.10 Windows ARM64

imagequant-1.1.1-cp310-cp310-win_amd64.whl (51.0 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

imagequant-1.1.1-cp310-cp310-win32.whl (39.6 kB view hashes)

Uploaded CPython 3.10 Windows x86

imagequant-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl (199.7 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

imagequant-1.1.1-cp310-cp310-musllinux_1_1_i686.whl (173.7 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

imagequant-1.1.1-cp310-cp310-musllinux_1_1_aarch64.whl (189.2 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ ARM64

imagequant-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (198.8 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

imagequant-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (188.2 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

imagequant-1.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (177.4 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

imagequant-1.1.1-cp310-cp310-macosx_11_0_arm64.whl (53.1 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

imagequant-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl (56.4 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ x86-64

imagequant-1.1.1-cp310-cp310-macosx_10_9_universal2.whl (102.7 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

imagequant-1.1.1-cp39-cp39-win_arm64.whl (41.0 kB view hashes)

Uploaded CPython 3.9 Windows ARM64

imagequant-1.1.1-cp39-cp39-win_amd64.whl (51.0 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

imagequant-1.1.1-cp39-cp39-win32.whl (39.6 kB view hashes)

Uploaded CPython 3.9 Windows x86

imagequant-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl (199.7 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

imagequant-1.1.1-cp39-cp39-musllinux_1_1_i686.whl (173.7 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

imagequant-1.1.1-cp39-cp39-musllinux_1_1_aarch64.whl (189.2 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ ARM64

imagequant-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (198.8 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

imagequant-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (188.2 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

imagequant-1.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (177.4 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

imagequant-1.1.1-cp39-cp39-macosx_11_0_arm64.whl (53.1 kB view hashes)

Uploaded CPython 3.9 macOS 11.0+ ARM64

imagequant-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl (56.4 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ x86-64

imagequant-1.1.1-cp39-cp39-macosx_10_9_universal2.whl (102.7 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

imagequant-1.1.1-cp38-cp38-win_amd64.whl (51.0 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

imagequant-1.1.1-cp38-cp38-win32.whl (39.6 kB view hashes)

Uploaded CPython 3.8 Windows x86

imagequant-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl (200.0 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

imagequant-1.1.1-cp38-cp38-musllinux_1_1_i686.whl (174.1 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

imagequant-1.1.1-cp38-cp38-musllinux_1_1_aarch64.whl (189.6 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ ARM64

imagequant-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (199.0 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

imagequant-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (188.3 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

imagequant-1.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (177.4 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

imagequant-1.1.1-cp38-cp38-macosx_11_0_arm64.whl (53.1 kB view hashes)

Uploaded CPython 3.8 macOS 11.0+ ARM64

imagequant-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl (56.4 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ x86-64

imagequant-1.1.1-cp38-cp38-macosx_10_9_universal2.whl (102.7 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64)

imagequant-1.1.1-cp37-cp37m-win_amd64.whl (51.0 kB view hashes)

Uploaded CPython 3.7m Windows x86-64

imagequant-1.1.1-cp37-cp37m-win32.whl (39.6 kB view hashes)

Uploaded CPython 3.7m Windows x86

imagequant-1.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl (199.5 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

imagequant-1.1.1-cp37-cp37m-musllinux_1_1_i686.whl (173.2 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

imagequant-1.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl (188.7 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ ARM64

imagequant-1.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (198.6 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

imagequant-1.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (187.6 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

imagequant-1.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (177.0 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

imagequant-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl (56.3 kB view hashes)

Uploaded CPython 3.7m macOS 10.9+ x86-64

imagequant-1.1.1-cp36-cp36m-win_amd64.whl (55.4 kB view hashes)

Uploaded CPython 3.6m Windows x86-64

imagequant-1.1.1-cp36-cp36m-win32.whl (43.3 kB view hashes)

Uploaded CPython 3.6m Windows x86

imagequant-1.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl (199.5 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ x86-64

imagequant-1.1.1-cp36-cp36m-musllinux_1_1_i686.whl (173.2 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ i686

imagequant-1.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl (188.7 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ ARM64

imagequant-1.1.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (198.6 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ x86-64

imagequant-1.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (187.6 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ ARM64

imagequant-1.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (177.0 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

imagequant-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl (56.1 kB view hashes)

Uploaded CPython 3.6m macOS 10.9+ x86-64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page