pylibheif
Python bindings for libheif using pybind11.
Features
- HEIC/HEIF Support: Read and write HEIC images (HEVC/H.265 encoded)
- AVIF Support: Read and write AVIF images (AV1 encoded)
- JPEG2000 Support: Read and write JPEG2000 images in HEIF container
- NumPy Integration: Zero-copy access to image data via Python Buffer Protocol
- Metadata Support: Read and write EXIF, XMP, and custom metadata
- Asynchronous Support: Built-in
asynciowrappers for non-blocking I/O and encoding - RAII Resource Management: Automatic resource cleanup with context managers
Supported Formats
| Format | Decoding | Encoding | Codec |
|---|---|---|---|
| HEIC (HEVC/H.265) | ✅ | ✅ | libde265 / x265 |
| AVIF (AV1) | ✅ | ✅ | DAV1D + AOM |
| JPEG2000 | ✅ | ✅ | OpenJPEG |
Requirements
- Python >= 3.12
- NumPy >= 1.26.0
- CMake >= 3.15
- C++17 compatible compiler
System Dependencies
# macOS
brew install openjpeg
# Ubuntu/Debian
sudo apt install libopenjp2-7-dev
Installation
pip install pylibheif
Or with uv:
uv pip install pylibheif
Building from Source
# Clone with submodules
git clone --recursive https://github.com/twn39/pylibheif.git
cd pylibheif
# Install
uv pip install -e .
Usage
Reading HEIC/AVIF Images
Using context manager (recommended):
import pylibheif
import numpy as np
# Open HEIC file with context manager
with pylibheif.HeifContext() as ctx:
ctx.read_from_file('image.heic')
# Get primary image handle
handle = ctx.get_primary_image_handle()
print(f'Image size: {handle.width}x{handle.height}')
print(f'Has alpha: {handle.has_alpha}')
# Decode to RGB
img = handle.decode(pylibheif.HeifColorspace.RGB,
pylibheif.HeifChroma.InterleavedRGB)
# Get as NumPy array (zero-copy)
plane = img.get_plane(pylibheif.HeifChannel.Interleaved, False)
arr = np.asarray(plane) # shape: (height, width, 3)
Explicit creation (for more control):
import pylibheif
import numpy as np
# Create context explicitly
ctx = pylibheif.HeifContext()
ctx.read_from_file('image.heic')
handle = ctx.get_primary_image_handle()
img = handle.decode(pylibheif.HeifColorspace.RGB,
pylibheif.HeifChroma.InterleavedRGB)
plane = img.get_plane(pylibheif.HeifChannel.Interleaved, False)
arr = np.asarray(plane)
# Resources are automatically freed when objects go out of scope
Writing HEIC Images (H.265)
import pylibheif
import numpy as np
# Create image from NumPy array
width, height = 1920, 1080
img = pylibheif.HeifImage(width, height,
pylibheif.HeifColorspace.RGB,
pylibheif.HeifChroma.InterleavedRGB)
img.add_plane(pylibheif.HeifChannel.Interleaved, width, height, 8)
# Fill with data
plane = img.get_plane(pylibheif.HeifChannel.Interleaved, True)
arr = np.asarray(plane)
arr[:] = your_image_data # your RGB data
# Encode and save as HEIC
ctx = pylibheif.HeifContext()
encoder = pylibheif.HeifEncoder(pylibheif.HeifCompressionFormat.HEVC)
encoder.set_lossy_quality(85)
encoder.encode_image(ctx, img)
ctx.write_to_file('output.heic')
Writing AVIF Images (AV1)
import pylibheif
import numpy as np
# Prepare image (same as above)
width, height = 1920, 1080
img = pylibheif.HeifImage(width, height,
pylibheif.HeifColorspace.RGB,
pylibheif.HeifChroma.InterleavedRGB)
img.add_plane(pylibheif.HeifChannel.Interleaved, width, height, 8)
# Encode and save as AVIF
ctx = pylibheif.HeifContext()
# Use AV1 format for AVIF
encoder = pylibheif.HeifEncoder(pylibheif.HeifCompressionFormat.AV1)
encoder.set_lossy_quality(85)
encoder.set_parameter("speed", "6") # Optional: Tune speed (0-9)
encoder.encode_image(ctx, img)
# Save with .avif extension
ctx.write_to_file('output.avif')
Writing JPEG Images
import pylibheif
import numpy as np
# Prepare image (same as above)
width, height = 1920, 1080
img = pylibheif.HeifImage(width, height,
pylibheif.HeifColorspace.RGB,
pylibheif.HeifChroma.InterleavedRGB)
img.add_plane(pylibheif.HeifChannel.Interleaved, width, height, 8)
# Encode and save as JPEG
ctx = pylibheif.HeifContext()
# Use JPEG format
encoder = pylibheif.HeifEncoder(pylibheif.HeifCompressionFormat.JPEG)
encoder.set_lossy_quality(90) # Quality 0-100
encoder.encode_image(ctx, img)
# Save with .jpg extension
ctx.write_to_file('output.jpg')
Writing JPEG2000 Images
import pylibheif
import numpy as np
# Prepare image (same as above)
width, height = 1920, 1080
img = pylibheif.HeifImage(width, height,
pylibheif.HeifColorspace.RGB,
pylibheif.HeifChroma.InterleavedRGB)
img.add_plane(pylibheif.HeifChannel.Interleaved, width, height, 8)
# Encode and save as JPEG2000 in HEIF container
ctx = pylibheif.HeifContext()
# Use JPEG2000 format
encoder = pylibheif.HeifEncoder(pylibheif.HeifCompressionFormat.JPEG2000)
encoder.set_lossy_quality(85) # Quality 0-100
encoder.encode_image(ctx, img)
# Save with .jp2 or .heif extension
# Note: libheif typically saves JPEG2000 in a HEIF container
ctx.write_to_file('output.heif')
Encoder Selection
By default, pylibheif selects the best available encoder for the requested format (e.g. x265 for HEVC). You can also explicitly select a specific encoder (e.g. Kvazaar) if available.
import pylibheif
# 1. Get all available HEVC encoders
descriptors = pylibheif.get_encoder_descriptors(pylibheif.HeifCompressionFormat.HEVC)
# Print available encoders
for d in descriptors:
print(f"ID: {d.id_name}, Name: {d.name}")
# 2. Find specific encoder (e.g. Kvazaar)
kvazaar_desc = next((d for d in descriptors if "kvazaar" in d.id_name), None)
if kvazaar_desc:
# 3. Create encoder explicitly using the descriptor
encoder = pylibheif.HeifEncoder(kvazaar_desc)
# Verify which encoder is used
print(f"Using encoder: {encoder.name}")
encoder.set_lossy_quality(85)
# encoder.encode_image(...)
# encoder.encode_image(...)
Reading Metadata
import pylibheif
ctx = pylibheif.HeifContext()
ctx.read_from_file('image.heic')
handle = ctx.get_primary_image_handle()
# Get metadata block IDs
exif_ids = handle.get_metadata_block_ids('Exif')
for id in exif_ids:
metadata_type = handle.get_metadata_block_type(id)
metadata_bytes = handle.get_metadata_block(id)
print(f'Metadata type: {metadata_type}, size: {len(metadata_bytes)}')
Writing Metadata
import pylibheif
import numpy as np
# Create and encode an image
width, height = 64, 64
img = pylibheif.HeifImage(width, height,
pylibheif.HeifColorspace.RGB,
pylibheif.HeifChroma.InterleavedRGB)
img.add_plane(pylibheif.HeifChannel.Interleaved, width, height, 8)
plane = img.get_plane(pylibheif.HeifChannel.Interleaved, True)
arr = np.asarray(plane)
arr[:] = 128 # fill with gray
ctx = pylibheif.HeifContext()
encoder = pylibheif.HeifEncoder(pylibheif.HeifCompressionFormat.HEVC)
encoder.set_lossy_quality(85)
handle = encoder.encode_image(ctx, img)
# Add EXIF metadata (with 4-byte offset prefix for TIFF header)
exif_data = b'\x00\x00\x00\x00' + b'Exif\x00\x00' + b'II*\x00...' # your EXIF data
ctx.add_exif_metadata(handle, exif_data)
# Add XMP metadata
xmp_data = b'''<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:creator>My App</dc:creator>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>'''
ctx.add_xmp_metadata(handle, xmp_data)
# Add custom/generic metadata
custom_data = b'{"app": "myapp", "version": "1.0"}'
ctx.add_generic_metadata(handle, custom_data, "json", "application/json")
# Save
ctx.write_to_file('output_with_metadata.heic')
Asynchronous Support (asyncio)
pylibheif provides asynchronous wrappers for non-blocking I/O and CPU-intensive operations (like encoding and decoding) using asyncio.to_thread.
Async Reading and Decoding
import pylibheif
import asyncio
import numpy as np
async def read_async():
# Recommended: Use 'async with' context manager
async with pylibheif.AsyncHeifContext() as ctx:
await ctx.read_from_file('image.heic')
handle = ctx.get_primary_image_handle()
# Asynchronously decode (offloaded to thread)
img = await handle.decode(pylibheif.HeifColorspace.RGB,
pylibheif.HeifChroma.InterleavedRGB)
plane = img.get_plane(pylibheif.HeifChannel.Interleaved, False)
arr = np.asarray(plane)
return arr
asyncio.run(read_async())
Async Encoding and Writing
import pylibheif
import asyncio
import numpy as np
async def write_async(image_data):
width, height = 1920, 1080
img = pylibheif.HeifImage(width, height,
pylibheif.HeifColorspace.RGB,
pylibheif.HeifChroma.InterleavedRGB)
img.add_plane(pylibheif.HeifChannel.Interleaved, width, height, 8)
plane = img.get_plane(pylibheif.HeifChannel.Interleaved, True)
np.asarray(plane)[:] = image_data
async with pylibheif.AsyncHeifContext() as ctx:
encoder = pylibheif.AsyncHeifEncoder(pylibheif.HeifCompressionFormat.HEVC)
encoder.set_lossy_quality(85)
# Asynchronously encode (offloaded to thread)
await encoder.encode_image(ctx, img)
# Asynchronously write to file
await ctx.write_to_file('output.heic')
asyncio.run(write_async(your_image_data))
API Reference
class pylibheif.HeifContext
Manages the valid lifetime of libheif context. It is the main entry point (root object) for high-level API.
Methods
__init__()
Creates a new empty context.
read_from_file(filename: str) -> None
Reads a HEIF file from the given filename.
filename: Path to the HEIF file.
read_from_memory(data: bytes) -> None
Reads a HEIF file from a bytes object.
data: Bytes containing the file content.
write_to_file(filename: str) -> None
Writes the current context to a file.
filename: Destination path.
write_to_bytes() -> bytes
Writes the current context to a bytes object.
- Returns:
bytesobject containing the encoded file data.
get_primary_image_handle() -> HeifImageHandle
Gets the handle for the primary image in the file.
- Returns:
HeifImageHandlefor the primary image.
get_image_handle(id: int) -> HeifImageHandle
Gets the handle for a specific image ID.
id: The ID of the image (seeget_list_of_top_level_image_IDs).- Returns:
HeifImageHandle.
get_list_of_top_level_image_IDs() -> List[int]
Gets a list of IDs of all top-level images in the file.
- Returns: List of integer IDs.
add_exif_metadata(handle: HeifImageHandle, data: bytes) -> None
Adds EXIF metadata to the specified image.
handle: Image handle from encoding.data: Raw EXIF bytes (with 4-byte offset prefix for TIFF header).
add_xmp_metadata(handle: HeifImageHandle, data: bytes) -> None
Adds XMP metadata to the specified image.
handle: Image handle from encoding.data: XMP XML as bytes.
add_generic_metadata(handle: HeifImageHandle, data: bytes, item_type: str, content_type: str = "") -> None
Adds generic/custom metadata to the specified image.
handle: Image handle from encoding.data: Raw metadata bytes.item_type: Metadata item type (e.g. "json", "iptc").content_type: Optional MIME content type (e.g. "application/json").
class pylibheif.HeifImageHandle
Represents a compressed image within the HEIF file.
Properties
width(int): The width of the image.height(int): The height of the image.has_alpha(bool): True if the image has an alpha channel.
Methods
decode(colorspace: HeifColorspace = HeifColorspace.RGB, chroma: HeifChroma = HeifChroma.InterleavedRGB) -> HeifImage
Decodes the image handle into an uncompressed HeifImage.
colorspace: Target colorspace (default: RGB).chroma: Target chroma format (default: InterleavedRGB).- Returns: Decoded
HeifImage.
get_metadata_block_ids(type_filter: str = "") -> List[str]
Gets a list of metadata block IDs attached to this image.
type_filter: Optional filter string (e.g. "Exif", "XMP").- Returns: List of metadata ID strings.
get_metadata_block_type(id: str) -> str
Gets the type string of a specific metadata block.
id: Metadata ID.- Returns: Type string (e.g. "Exif").
get_metadata_block(id: str) -> bytes
Gets the raw data of a metadata block.
id: Metadata ID.- Returns:
bytesobject containing the metadata.
class pylibheif.HeifImage
Represents an uncompressed image containing pixel data. Supports the Python Buffer Protocol for zero-copy access with NumPy.
Properties
width(int): The width of the image.height(int): The height of the image.
Methods
__init__(width: int, height: int, colorspace: HeifColorspace, chroma: HeifChroma)
Creates a new empty image.
width: Image width.height: Image height.colorspace: Image colorspace.chroma: Image chroma format.
add_plane(channel: HeifChannel, width: int, height: int, bit_depth: int) -> None
Adds a new plane to the image.
channel: The channel type (e.g.HeifChannel.Interleaved).width: Width of the plane.height: Height of the plane.bit_depth: Bit depth (e.g. 8).
get_plane(channel: HeifChannel, writeable: bool = False) -> HeifPlane
Gets a plane object that supports the buffer protocol.
channel: The channel to retrieve.writeable: Whether the buffer should be writable.- Returns:
HeifPlaneobject (wrappable withnp.asarray()).
class pylibheif.HeifEncoder
Controls the encoding process.
Methods
__init__(format: HeifCompressionFormat)
Creates a new encoder for the specified format.
format: Compression format (e.g.HeifCompressionFormat.HEVC).
set_lossy_quality(quality: int) -> None
Sets the quality for lossy compression.
quality: Integer between 0 (lowest) and 100 (highest).
set_parameter(name: str, value: str) -> None
Sets a low-level encoder parameter.
name: Parameter name (e.g. "speed" for AV1).value: Parameter value.
encode_image(context: HeifContext, image: HeifImage, preset: str = "") -> HeifImageHandle
Encodes the given image and appends it to the context.
context: The destinationHeifContext.image: The sourceHeifImageto encode.preset: Optional encoder preset (e.g. "ultrafast", "slow"). Default is empty (balanced/default). Note: This maps to the 'preset' parameter in libheif. It works for x265 (check version), but AOM and others may use different parameters (e.g. 'speed') which should be set viaset_parameterinstead.- Returns:
HeifImageHandlefor the encoded image. Can be used to add metadata.
class pylibheif.AsyncHeifContext
Asynchronous wrapper for HeifContext. Methods are awaited and offloaded to a background thread.
Methods
async read_from_file(filename: str) -> None
async read_from_memory(data: bytes) -> None
async write_to_file(filename: str) -> None
async write_to_bytes() -> bytes
get_primary_image_handle() -> AsyncHeifImageHandle
get_image_handle(id: int) -> AsyncHeifImageHandle
class pylibheif.AsyncHeifImageHandle
Asynchronous wrapper for HeifImageHandle.
Methods
async decode(colorspace, chroma) -> HeifImage
Asynchronously decodes the image.
class pylibheif.AsyncHeifEncoder
Asynchronous wrapper for HeifEncoder.
Methods
async encode_image(ctx, image, preset="") -> HeifImageHandle
Asynchronously encodes the image.
Enums
pylibheif.HeifColorspace
RGB,YCbCr,Monochrome,Undefined
pylibheif.HeifChroma
InterleavedRGB: Interleaved R, G, B bytes.InterleavedRGBA: Interleaved R, G, B, A bytes.C420: YUV 4:2:0 planar.C422: YUV 4:2:2 planar.C444: YUV 4:4:4 planar.Monochrome.
pylibheif.HeifChannel
Interleaved: For interleaved RGB/RGBA.Y,Cb,Cr: For YUV planar.R,G,B: For RGB planar.Alpha: For Alpha channel.
pylibheif.HeifCompressionFormat
HEVC: H.265 (libx265).AV1: AV1 (AOM/RAV1E/SVT).JPEG: JPEG.JPEG2000: JPEG 2000 (OpenJPEG).
Building from Source
# Clone with submodules
git clone --recursive https://github.com/your-username/pylibheif.git
cd pylibheif
# Build
uv pip install -e .
Performance
Performance
Benchmarks on 1280x720 RGB image (Apple Silicon), comparing encoders at Iso-Quality (approx. 29.2 dB PSNR) to ensure fair speed comparison.
Baseline: x265 (HEVC) at Quality 80 (Medium Preset).
| Encoder | Quality Setting | Time (Mean) | vs x265 | Note |
|---|---|---|---|---|
| AOM AV1 | Q86 (Speed 6) | ~115 ms | 1.8x Faster | 🚀 Fastest & Best Efficiency |
| Kvazaar (HEVC) | Q80 | ~125 ms | 1.6x Faster | Best HEVC option |
| x265 (HEVC) | Q80 | ~206 ms | Baseline |
Key Findings:
- AOM AV1 Efficiency: Surprisingly,
libaom(at speed 6) is the fastest encoder in this test, outperforming even the highly optimized Kvazaar HEVC encoder while maintaining excellent compression efficiency (smallest file size). - HEVC Choice: If you need HEVC, Kvazaar is significantly faster than x265 for similar quality.
Raw Benchmark Output (Iso-Quality Run)
----------------------------------------------------------------------------------
Test: 1280x720 RGB Image, 10 Rounds
----------------------------------------------------------------------------------
Name (time in ms) Mean OPS
----------------------------------------------------------------------------------
test_benchmark_encode_aom_av1 115.64 8.65 (Q86)
test_benchmark_encode_kvazaar 125.19 7.96 (Q80)
test_benchmark_encode_x265 206.03 4.65 (Q80 / Limit)
----------------------------------------------------------------------------------
Run benchmarks yourself:
uv pip install pillow-heif pytest-benchmark
uv run pytest tests/test_benchmark.py --benchmark-only --benchmark-min-rounds=20
License
This project is licensed under the LGPL-3.0 License - see the LICENSE file for details.
Acknowledgments
Metadata
Release files for pylibheif 1.21.2.post12
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pylibheif-1.21.2.post12.tar.gz | 4.4 MB | Details |
Built distributions (wheels)
Total release size: 71.3 MB
Release files / pylibheif-1.21.2.post12.tar.gz
| Download URL | pylibheif-1.21.2.post12.tar.gz |
|---|---|
| Size | 4.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e0fb554c2bcd14ee27c9de220bb88652e3b629d7236f6546fc3e0fa34d1233f2
|
|
BLAKE2b-256 checksum How to use checksums |
27ea3d2e5e0c6b13751c962f659be75bfef8ccd1024c8bb90771a8a67590546b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 8, 2026.
Transparency logRelease files / pylibheif-1.21.2.post12-cp314-cp314-win_amd64.whl
| Download URL | pylibheif-1.21.2.post12-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 6.4 MB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
f6bd2a70aad7a005128af428b8b5a023f285fef1887348bf78f097964cde11e7
|
|
BLAKE2b-256 checksum How to use checksums |
9100cbfb5eb24f9fa1a9fbfab5761f24cc9a2239ed72e1cf225178fab25ff2d8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 8, 2026.
Transparency logRelease files / pylibheif-1.21.2.post12-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pylibheif-1.21.2.post12-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | CPython 3.14 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
02916be621bd90e715282aee069fbcc26d9c459abcbb44833db91dc682857b91
|
|
BLAKE2b-256 checksum How to use checksums |
bdaf6b8add1163896c5c234f073bdad1e698bddf33b7d0f1865920f7f4e24a55
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 8, 2026.
Transparency logRelease files / pylibheif-1.21.2.post12-cp314-cp314-macosx_14_0_arm64.whl
| Download URL | pylibheif-1.21.2.post12-cp314-cp314-macosx_14_0_arm64.whl |
|---|---|
| Size | 4.7 MB |
| Tags | CPython 3.14 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
2850d8d5d602653b485d8ef1007a0af63db159720ebad5b0de29c7099dfed949
|
|
BLAKE2b-256 checksum How to use checksums |
8c0a538f5ae8c454bc8466ed463552411cf0fea282f0f25097cda9eadd5471fa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 8, 2026.
Transparency logRelease files / pylibheif-1.21.2.post12-cp313-cp313-win_amd64.whl
| Download URL | pylibheif-1.21.2.post12-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 6.3 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
a87b46b07ad4bd0e228c4fe63b46dba778e8c29ae69f9b233bc9ccb92df35b2d
|
|
BLAKE2b-256 checksum How to use checksums |
4c86323fe0e8ed3058023cd7ba68d361764ea9d0bfeac58c8311a0c461379f04
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 8, 2026.
Transparency logRelease files / pylibheif-1.21.2.post12-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pylibheif-1.21.2.post12-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
3948542882ddb22e2a90e538c3887d2846293f847f25a753b9fce2d05edc80e4
|
|
BLAKE2b-256 checksum How to use checksums |
fff1aabb5cb5921c4314fc19435a7e132bb853e72e41853816cfb97ef6296f9c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 8, 2026.
Transparency logRelease files / pylibheif-1.21.2.post12-cp313-cp313-macosx_14_0_arm64.whl
| Download URL | pylibheif-1.21.2.post12-cp313-cp313-macosx_14_0_arm64.whl |
|---|---|
| Size | 4.7 MB |
| Tags | CPython 3.13 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
7239554c71dc4d99342f892f85c76578f92bcb0525964822cd244cf6e50e39d6
|
|
BLAKE2b-256 checksum How to use checksums |
4ddaffeda2d470825776c0a6ab8517fe0c4f8343e63f38374144ac5e6910167d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 8, 2026.
Transparency logRelease files / pylibheif-1.21.2.post12-cp312-cp312-win_amd64.whl
| Download URL | pylibheif-1.21.2.post12-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 6.3 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
6c6b80df0c02776fc66a4c8d4f39fbe34b6beea4fa4b746cf426992c38f1b0b8
|
|
BLAKE2b-256 checksum How to use checksums |
b64e6256a73dd0003b50717d408a1c7d9c92a946629ebf75282fc279d92c70dc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 8, 2026.
Transparency logRelease files / pylibheif-1.21.2.post12-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pylibheif-1.21.2.post12-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
a92d1882399f83ca731b2aef0a8fa3fac215899b4c274ff9ae91b28a2a59cb96
|
|
BLAKE2b-256 checksum How to use checksums |
fd80cebe8c0ff8b515bab8596dff710a842bf7758b4ba6aee35a2d3ee65d2d63
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 8, 2026.
Transparency logRelease files / pylibheif-1.21.2.post12-cp312-cp312-macosx_14_0_arm64.whl
| Download URL | pylibheif-1.21.2.post12-cp312-cp312-macosx_14_0_arm64.whl |
|---|---|
| Size | 4.7 MB |
| Tags | CPython 3.12 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a836c773b305633ed3f0bf99315c5c0f126aa5d8e2fd905300dc34f4420580f2
|
|
BLAKE2b-256 checksum How to use checksums |
e8a94dfe6b14769cf1bacedc8353b1f2659c57be539a05889662774f85134ff2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 8, 2026.
Transparency logRelease files / pylibheif-1.21.2.post12-cp311-cp311-win_amd64.whl
| Download URL | pylibheif-1.21.2.post12-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 6.3 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
c2bbc9989c3a065ca9f2a6f798941c79848b4915e801cb0ae9bbf706c1036dea
|
|
BLAKE2b-256 checksum How to use checksums |
d51b3b1500b8ba158b55f26d78de313dcd76ea48750fe8185901ec6b1a925ba0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 8, 2026.
Transparency logRelease files / pylibheif-1.21.2.post12-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pylibheif-1.21.2.post12-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
f1df8468b26079d53af219a520a1c90267a6c8d95fb4a93659ae194e5c6b2771
|
|
BLAKE2b-256 checksum How to use checksums |
3776a63f4ab1996f63d1e1f387d78fb6d9c80ed1504fdd4622bf69d2a2cf3c13
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 8, 2026.
Transparency logRelease files / pylibheif-1.21.2.post12-cp311-cp311-macosx_14_0_arm64.whl
| Download URL | pylibheif-1.21.2.post12-cp311-cp311-macosx_14_0_arm64.whl |
|---|---|
| Size | 4.7 MB |
| Tags | CPython 3.11 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
61569114e34acabf0f42a9b7fcb8d29a65b5b40b0fc958492089205b903b971c
|
|
BLAKE2b-256 checksum How to use checksums |
2fe3aec84bfbfbca937d37941c5f741482bd802771685423a5f125b9ca9fa734
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 8, 2026.
Transparency log