Skip to main content

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-cli for replacing CLI wrappers with symlinks.

Metadata

Release files for libheif-binary 1.20.2.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for libheif-binary 1.20.2.3
File
libheif_binary-1.20.2.3-py3-none-musllinux_1_2_x86_64.whl Python 3 none Linux musl 1.2+ x86-64 Details
libheif_binary-1.20.2.3-py3-none-musllinux_1_2_aarch64.whl Python 3 none Linux musl 1.2+ ARM64 Details
libheif_binary-1.20.2.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.20.2.3-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64, Linux glibc 2.27+ ARM64 Details
libheif_binary-1.20.2.3-py3-none-macosx_11_0_universal2.whl Python 3 none macOS 11.0+ universal2 (ARM64, x86-64) Details

Total release size: 41.4 MB

Release files / libheif_binary-1.20.2.3-py3-none-musllinux_1_2_x86_64.whl

Download URL libheif_binary-1.20.2.3-py3-none-musllinux_1_2_x86_64.whl
Size 7.6 MB
Tags Linux musl 1.2+ x86-64 Python 3
SHA-256 checksum
How to use checksums
9a7b9bf8d98c6d5f9a358e1ad01cc3100cb3498a04973140b42f079d1afd0c42
BLAKE2b-256 checksum
How to use checksums
5496374bceb0418b4a8031e1fa7a14775aa4f2925cc2a317df9e4ef08661fd44
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.20.2.3-py3-none-musllinux_1_2_aarch64.whl

Download URL libheif_binary-1.20.2.3-py3-none-musllinux_1_2_aarch64.whl
Size 8.5 MB
Tags Linux musl 1.2+ ARM64 Python 3
SHA-256 checksum
How to use checksums
25bfadd97c3c973bba846565e591cb56aed742128b0e77a3df4c085fd5a67d93
BLAKE2b-256 checksum
How to use checksums
426525ef1ad44451b2423dc1fe5440bc2903c9590316e735ca8c57dce5a3d211
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.20.2.3-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL libheif_binary-1.20.2.3-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 6.6 MB
Tags Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
e5984621ddc6e03ce182a7f0ab1f18fdd5bf5c19b38fd4c0a006636983382598
BLAKE2b-256 checksum
How to use checksums
9d0aa24d0c5532e459ec77b72a13c1bbd4f5248f92cec73d55460b5410b163eb
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.20.2.3-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

Download URL libheif_binary-1.20.2.3-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Size 7.6 MB
Tags Linux glibc 2.27+ ARM64 Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
0d3b94a18fc4ba29bab5e33fa067ed87d52b90faa54115560d7fb6a84f172d4f
BLAKE2b-256 checksum
How to use checksums
d2d581fd7afc41159a674703ad9770a4a76556f0a9db60e2d60e61a20c9d63e5
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.20.2.3-py3-none-macosx_11_0_universal2.whl

Download URL libheif_binary-1.20.2.3-py3-none-macosx_11_0_universal2.whl
Size 11.0 MB
Tags Python 3 macOS 11.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
03361067a2f493e5a6c61efdc9e51520229c81ff0e56a65abc4f2236740b84f9
BLAKE2b-256 checksum
How to use checksums
2c97bcbfc5c80b46653b5bb3cfc649f144f793c0262af7a1e826f1b7f716aacc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.10
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page