Skip to main content

Python bindings for libheif - HEIC/AVIF/JPEG2000 image codec

Project description

pylibheif

PyPI version Build and Publish License: LGPL v3 Python 3.11+

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
  • 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(...)

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')

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: bytes object containing the encoded file data.

get_primary_image_handle() -> HeifImageHandle Gets the handle for the primary image in the file.

  • Returns: HeifImageHandle for the primary image.

get_image_handle(id: int) -> HeifImageHandle Gets the handle for a specific image ID.

  • id: The ID of the image (see get_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: bytes object 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: HeifPlane object (wrappable with np.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 destination HeifContext.
  • image: The source HeifImage to 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 and likely SVT-AV1 (check version), but AOM and others may use different parameters (e.g. 'speed') which should be set via set_parameter instead.
  • Returns: HeifImageHandle for the encoded image. Can be used to add metadata.

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 1920x1080 RGB image (Apple Silicon), simulating a "Real-World" balanced scenario:

  • Quality: 80
  • x265 Preset: medium
  • AV1 Speed: 6
Operation pylibheif pillow-heif Note
HEVC Decode 31.1 ms 25.7 ms
HEVC Encode (x265) 194 ms 183 ms Preset "medium", Q80
HEVC Encode (Kvazaar) 122 ms - Q80 (Default preset)
AV1 Encode 95 ms - Speed 6, Q80

Key Benchmark Findings (based on 20-round test):

  1. Kvazaar Efficiency: Kvazaar (~122ms) is significantly faster (~1.6x) than x265 (~194ms) when both are running in a balanced/medium configuration at Quality 80.
  2. AV1 Speed: The AOM AV1 encoder at speed=6 is markedly fast (~95ms), outperforming both HEVC encoders. This confirms AV1's viability for responsive encoding tasks.
  3. Decoding: Both libraries offer very fast decoding (~25-30ms).
Raw Benchmark Output (Refined 20-round run)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Name (time in ms)                          Min                 Max                Mean            StdDev              Median                IQR            Outliers      OPS            Rounds  Iterations
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_benchmark_decode_hevc_pillow      25.1037 (1.0)       29.0527 (1.0)       25.6666 (1.0)      0.7504 (1.0)       25.5727 (1.0)       0.5844 (1.0)           3;3  38.9611 (1.0)          35           1
test_benchmark_decode_hevc             30.3832 (1.21)      34.1134 (1.17)      31.1261 (1.21)     0.8224 (1.10)      31.1342 (1.22)      0.8100 (1.39)          2;2  32.1274 (0.82)         31           1
test_benchmark_encode_av1              91.6138 (3.65)     105.3451 (3.63)      95.1657 (3.71)     2.9617 (3.95)      95.1245 (3.72)      3.1292 (5.35)          3;1  10.5080 (0.27)         20           1
test_benchmark_encode_kvazaar         120.6191 (4.80)     136.9627 (4.71)     122.1626 (4.76)     3.5188 (4.69)     121.3550 (4.75)      0.7922 (1.36)          1;1   8.1858 (0.21)         20           1
test_benchmark_encode_hevc_pillow     171.8147 (6.84)     197.4089 (6.79)     182.5619 (7.11)     7.8343 (10.44)    182.6163 (7.14)     13.4670 (23.04)         9;0   5.4776 (0.14)         20           1
test_benchmark_encode_hevc            181.1458 (7.22)     206.9737 (7.12)     194.3554 (7.57)     7.9335 (10.57)    195.1668 (7.63)     13.0224 (22.28)         7;0   5.1452 (0.13)         20           1
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

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

pylibheif-1.21.2.post6.tar.gz (2.8 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pylibheif-1.21.2.post6-cp314-cp314-manylinux_2_28_x86_64.whl (23.0 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

pylibheif-1.21.2.post6-cp314-cp314-macosx_14_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

pylibheif-1.21.2.post6-cp313-cp313-manylinux_2_28_x86_64.whl (23.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

pylibheif-1.21.2.post6-cp313-cp313-macosx_14_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

pylibheif-1.21.2.post6-cp312-cp312-manylinux_2_28_x86_64.whl (23.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

pylibheif-1.21.2.post6-cp312-cp312-macosx_14_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

pylibheif-1.21.2.post6-cp311-cp311-manylinux_2_28_x86_64.whl (23.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

pylibheif-1.21.2.post6-cp311-cp311-macosx_14_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

File details

Details for the file pylibheif-1.21.2.post6.tar.gz.

File metadata

  • Download URL: pylibheif-1.21.2.post6.tar.gz
  • Upload date:
  • Size: 2.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pylibheif-1.21.2.post6.tar.gz
Algorithm Hash digest
SHA256 404e36df955ff6cca7ab2817408ac3adb0520f9cf9781f2988f0206a1c954ea6
MD5 3186f1435325c0800775b36003e46081
BLAKE2b-256 d4f734c5ac7f859770e4f9c6b811890a2abdd4f44a86e26b52bc5f0651ff3a20

See more details on using hashes here.

Provenance

The following attestation bundles were made for pylibheif-1.21.2.post6.tar.gz:

Publisher: build.yml on twn39/pylibheif

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pylibheif-1.21.2.post6-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pylibheif-1.21.2.post6-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8c65ebb97f6febb52af276e605a6a50ed2b22adc9e0ca320745668537f01dd24
MD5 365d5df7cba1f1641a4594d2bb883d0a
BLAKE2b-256 7c628cfcab70da3e70b26c17a3e03c5361dd9824b68b2478c7f6f578b591eb3a

See more details on using hashes here.

Provenance

The following attestation bundles were made for pylibheif-1.21.2.post6-cp314-cp314-manylinux_2_28_x86_64.whl:

Publisher: build.yml on twn39/pylibheif

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pylibheif-1.21.2.post6-cp314-cp314-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for pylibheif-1.21.2.post6-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 7111e7669f45e9764c53ceb37e1927acfe29f94631fcfa696c3e8ed8f0e43227
MD5 0d05cfaf88c94d08043e8119fe51629c
BLAKE2b-256 1261bf15c367ee0df923437a83b21ca6809dde21d3890b73bdf2e8f9ca0bfe53

See more details on using hashes here.

Provenance

The following attestation bundles were made for pylibheif-1.21.2.post6-cp314-cp314-macosx_14_0_arm64.whl:

Publisher: build.yml on twn39/pylibheif

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pylibheif-1.21.2.post6-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pylibheif-1.21.2.post6-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 dc3852b2aacab298cc73723bb23f7c512f6fdc30b5e2949bebb2a0852c94369a
MD5 135e0328213f45b35c3565addc0743dd
BLAKE2b-256 beead4dc959ea6ff95b5d377531380619393f4ad5aebc5fbca05d102701e8cd8

See more details on using hashes here.

Provenance

The following attestation bundles were made for pylibheif-1.21.2.post6-cp313-cp313-manylinux_2_28_x86_64.whl:

Publisher: build.yml on twn39/pylibheif

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pylibheif-1.21.2.post6-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for pylibheif-1.21.2.post6-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 0d76f4a19389abfbe4dbabfc4eba619d2771c57345d53458e1c38f2a91e91758
MD5 fec0560949d2d53579eabbdf1437bfad
BLAKE2b-256 e46f525cf38a9f63165b3948df0e3a03699a1a30dc1777a7aa56d0523e403794

See more details on using hashes here.

Provenance

The following attestation bundles were made for pylibheif-1.21.2.post6-cp313-cp313-macosx_14_0_arm64.whl:

Publisher: build.yml on twn39/pylibheif

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pylibheif-1.21.2.post6-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pylibheif-1.21.2.post6-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f7232f3004aa61233376100441344068567409fb2230e3519e1b9ccca7323abb
MD5 85298ce560a693d4878f6050df957060
BLAKE2b-256 e631d6e067f3aaa8db94ab4c49c1adc924f7fe1a0755319f87344034fb3533f0

See more details on using hashes here.

Provenance

The following attestation bundles were made for pylibheif-1.21.2.post6-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: build.yml on twn39/pylibheif

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pylibheif-1.21.2.post6-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for pylibheif-1.21.2.post6-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 e5dc8acf18e7dee9afc9ba85d752c10ae046688f7554f227572e73ac5d30b4ec
MD5 0423f992c313b752427a490a16e73832
BLAKE2b-256 377308a49c14918e96b93d7e15e1dd4bb8505300205ec6853604f6e7ef6940cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for pylibheif-1.21.2.post6-cp312-cp312-macosx_14_0_arm64.whl:

Publisher: build.yml on twn39/pylibheif

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pylibheif-1.21.2.post6-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pylibheif-1.21.2.post6-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 26e7f28e9a3a63e81be072bee93fd6b7704848412835451bf06a35e73b54faaf
MD5 2ca0c641924cba0b3054f95be0125f1c
BLAKE2b-256 400b2f04a052facb12a13b1e59e91c7affa4ebb511ed464d9f4f4f42feb49a47

See more details on using hashes here.

Provenance

The following attestation bundles were made for pylibheif-1.21.2.post6-cp311-cp311-manylinux_2_28_x86_64.whl:

Publisher: build.yml on twn39/pylibheif

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pylibheif-1.21.2.post6-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for pylibheif-1.21.2.post6-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 92f79add8922799995d1115eb92f47ee2b61c98cbdffcb468fdda4b65b2c8ee3
MD5 cdd612fd75010e79d9f933d31f105722
BLAKE2b-256 f6c27a35785e8acbef0a3d56c0853c9ebf5f9dcde2a352eb2690423a5d9cd146

See more details on using hashes here.

Provenance

The following attestation bundles were made for pylibheif-1.21.2.post6-cp311-cp311-macosx_14_0_arm64.whl:

Publisher: build.yml on twn39/pylibheif

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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