libheif_binary
Prebuilt libheif and its codec libraries for Python packages that read and write
HEIF and AVIF images. The package bundles native libraries and the heif-enc,
heif-dec and heif-info commands, with a small Python API for loading libheif.
It does not provide Python image objects or bindings to the full libheif API.
Supported platforms and Python versions
Requires Python 3.6 or newer and a wheel matching your operating system and architecture.
| Platform | Minimum system requirement | Architectures | Python |
|---|---|---|---|
Linux, glibc (manylinux_2_28) |
glibc 2.28 | x86_64, aarch64 | 3.6+ |
Linux, musl (musllinux_1_2) |
musl 1.2, including compatible Alpine Linux releases | x86_64, aarch64 | 3.6+ |
| macOS | macOS 11 | x86_64, arm64; combined universal2 wheel | 3.6+ |
Windows is not supported.
Compatibility and test coverage are distinct:
| Build | Python versions checked by CI |
|---|---|
| Linux, glibc | CPython 3.9, 3.14 and 3.14 free-threaded; PyPy interpreters included in the build image |
| Linux, musl | CPython 3.9, 3.14 and 3.14 free-threaded |
| macOS, including both universal2 architectures | CPython 3.12 |
Installation
Install the package:
pip install libheif_binary
The native libraries and CLI tools are bundled in the wheel. You do not need to install libheif or its codecs separately.
Package version
The package version is <libheif version>.<packaging revision>.
See Revisions for packaging changes.
Python API
get_version_str() returns the bundled libheif version as a string, such as
"1.17.6". get_version() returns it as an integer tuple, such as
(1, 17, 6).
get_build_config() returns cffi compiler and linker arguments for the bundled
headers and library:
from cffi import FFI
from libheif_binary import get_build_config
ffi = FFI()
ffi.set_source("_libheif", "#include <libheif/heif.h>", **get_build_config())
get_executable(name) returns an absolute path to heif-enc, heif-dec or
heif-info.
On Linux and macOS, preload the bundled library before importing a Python extension linked against libheif:
from libheif_binary import load_library
_libheif_handle = load_library()
from your_package import _libheif_cffi
Replace your_package._libheif_cffi with your extension module. Keep the returned
ctypes.CDLL object alive until the extension has finished importing. The library
is loaded with RTLD_GLOBAL so its symbols are available to linked extensions.
Command-line tools
Installation adds these commands to the Python environment:
| Command | Purpose |
|---|---|
heif-enc |
Encode images as HEIF or AVIF |
heif-dec |
Decode HEIF or AVIF images, including PNG and JPEG output |
heif-info |
Inspect image metadata and container information |
Use --help for the options supported by the bundled libheif version:
heif-enc --help
heif-dec --help
heif-info --help
By default, these commands start a Python wrapper that executes the native tool. To run them directly without starting Python, replace the wrappers in the installed environment with relative symlinks:
libheif-link-cli
This is optional and requires write access to the environment's scripts directory. Run it again after reinstalling or upgrading the package.
Building wheels
Run the following commands from the repository root. Wheels are saved in dist/.
Dependency versions and source checksums are pinned in versions/*.env.
Linux
With Docker running, build for glibc or musl:
make -C linux manylinux
make -C linux musllinux
To select an architecture, add ARCH=amd64 or ARCH=arm64:
make -C linux manylinux ARCH=arm64
Each build tests the installed wheel before exporting it.
macOS
Build with Python (3.12 tested) and the Xcode command-line tools:
make -C macos
The wheel targets the current architecture.
Testing
Run the unit tests from the repository root:
pytest tests -v
To test an installed wheel, run the smoke test:
python tests/smoke.py /path/to/example.heic
Use examples/example.heic from the pinned libheif source release.
Bundled libraries and licenses
The package includes libheif, x264, x265, libde265, libaom, libsharpyuv,
libpng and libjpeg-turbo.
License and patent notices for bundled dependencies are included in the
installed package's libheif_binary/licenses/ directory.
Revisions
Revision 3
- Update libaom from 3.15.1 to 3.15.2.
- Preserve ordinary symbol tables in all built libraries while excluding debug information.
- Restore compiler optimization for SharpYUV.
- Use shared SharpYUV libraries.
- Bundle source-built libpng 1.6.59 and libjpeg-turbo 3.2.0 on Linux.
Revision 2
- Bundle libheif headers with the plugin directory cleared.
- Add
get_build_config()and expose bundled executable paths.
Revision 1
- Include README in wheels.
Revision 0
- Bundle libheif, CLI tools, and codec libraries: x264 build 165 (commit
0480cb05fa18), x265 4.2, libde265 1.1.3, libaom 3.15.1, and SharpYUV from libwebp 1.6.0. - Provide library preloading and
libheif-link-clifor replacing CLI wrappers with symlinks.
Metadata
Release files for libheif-binary 1.19.8.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| libheif_binary-1.19.8.3-py3-none-musllinux_1_2_x86_64.whl | Python 3 | none | Linux musl 1.2+ x86-64 | Details |
| libheif_binary-1.19.8.3-py3-none-musllinux_1_2_aarch64.whl | Python 3 | none | Linux musl 1.2+ ARM64 | Details |
| libheif_binary-1.19.8.3-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| libheif_binary-1.19.8.3-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.27+ ARM64, Linux glibc 2.28+ ARM64 | Details |
| libheif_binary-1.19.8.3-py3-none-macosx_11_0_universal2.whl | Python 3 | none | macOS 11.0+ universal2 (ARM64, x86-64) | Details |
Total release size: 40.3 MB
Release files / libheif_binary-1.19.8.3-py3-none-musllinux_1_2_x86_64.whl
| Download URL | libheif_binary-1.19.8.3-py3-none-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 7.4 MB |
| Tags | Linux musl 1.2+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
df0fa7bc65e02b71ffe55c24640d8ef523bdc01c1b32263fb27eec732ddbdaa0
|
|
BLAKE2b-256 checksum How to use checksums |
4bfeb0f08702d1e73c71791eddf8f2d080d61884b60204e09f52b9768296a481
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|
Release files / libheif_binary-1.19.8.3-py3-none-musllinux_1_2_aarch64.whl
| Download URL | libheif_binary-1.19.8.3-py3-none-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 8.3 MB |
| Tags | Linux musl 1.2+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
1b68897ba8a4d1be30a9a0774d2f6da52ee74b146a20fdfe5175610d92a5f04e
|
|
BLAKE2b-256 checksum How to use checksums |
9d94779f574651a2c511960d2b1f9d9eed7b3c3af408c1bc501ba810c921a2eb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|
Release files / libheif_binary-1.19.8.3-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | libheif_binary-1.19.8.3-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 6.4 MB |
| Tags | Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
d19f47fb01bcaa9d030824b8259ab99f5e695033edc978daec6d9eabdb5ba204
|
|
BLAKE2b-256 checksum How to use checksums |
f8ca9e2329d4a7e8034e2fb3fe6b6c8092ef65ab6a2f18d02e038fa67842f9ca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|
Release files / libheif_binary-1.19.8.3-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
| Download URL | libheif_binary-1.19.8.3-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 7.4 MB |
| Tags | Linux glibc 2.27+ ARM64 Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
a9adb778e51e0afe55699314c2f68659eb945a63c3b90cf0b093c3199ca792a7
|
|
BLAKE2b-256 checksum How to use checksums |
6a854fdcfd328db2a6eef2d0c2253d510a17af2699d671a2ef1b64de15ec826f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|
Release files / libheif_binary-1.19.8.3-py3-none-macosx_11_0_universal2.whl
| Download URL | libheif_binary-1.19.8.3-py3-none-macosx_11_0_universal2.whl |
|---|---|
| Size | 10.8 MB |
| Tags | Python 3 macOS 11.0+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
84044688bf8fbbeaed69161ed0eba565229269bff7ada2213a14fc6cb70363e8
|
|
BLAKE2b-256 checksum How to use checksums |
97aeb1fcff32af4aed17f1f27d23b049e6da89ea872a27ffa2ef4b3591b5be69
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|