{"library":"pillow-heif","title":"Pillow-HEIF","description":"Pillow-HEIF is a Python interface for the libheif library, enabling the Pillow (PIL Fork) imaging library to open and save HEIF (High Efficiency Image File Format) and HEIC images. The current version is 1.3.0 and the project maintains an active release cadence with frequent updates to bundled libraries and bug fixes.","language":"python","status":"active","last_verified":"Wed May 13","install":{"commands":["pip install pillow-heif"],"cli":null},"imports":["from pillow_heif import register_heif_opener","from PIL import Image"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"from PIL import Image\nfrom pillow_heif import register_heif_opener\nimport os\n\n# Register the HEIF opener once at the start of your application\nregister_heif_opener()\n\n# --- Example: Open and convert a HEIF/HEIC image ---\nheif_path = os.environ.get('HEIF_INPUT_PATH', 'input.heif')\noutput_path = os.environ.get('OUTPUT_JPEG_PATH', 'output.jpeg')\n\ntry:\n    # Open a HEIF image\n    heif_img = Image.open(heif_path)\n    print(f\"Successfully opened HEIF image: {heif_path}\")\n    print(f\"Image format: {heif_img.format}, size: {heif_img.size}, mode: {heif_img.mode}\")\n\n    # Convert and save to JPEG\n    # Note: HEIF often has 10-bit or 12-bit depth. For 8-bit formats like JPEG,\n    # Pillow will convert, potentially losing some detail.\n    if heif_img.mode == 'LA': # Handle monochrome with alpha\n        heif_img = heif_img.convert('L')\n    elif 'A' in heif_img.mode: # Remove alpha for JPEG\n        heif_img = heif_img.convert('RGB')\n    else:\n        heif_img = heif_img.convert('RGB') # Ensure RGB for JPEG\n\n    heif_img.save(output_path, quality=90)\n    print(f\"Saved converted image to: {output_path}\")\n\nexcept FileNotFoundError:\n    print(f\"Error: HEIF input file '{heif_path}' not found.\")\n    print(\"Please ensure 'input.heif' exists or set HEIF_INPUT_PATH environment variable.\")\nexcept Exception as e:\n    print(f\"An error occurred: {e}\")\n\n# --- Example: Create and save a HEIF/HEIC image (requires an input image first) ---\n# This part assumes 'output.jpeg' was created or exists.\nif os.path.exists(output_path):\n    try:\n        jpeg_img = Image.open(output_path)\n        heic_output_path = os.environ.get('OUTPUT_HEIC_PATH', 'generated.heic')\n        # Save as HEIC. You can specify encoder parameters in .info['heif_metadata']\n        jpeg_img.save(heic_output_path, quality=80, save_all=True)\n        print(f\"Saved image back to HEIC: {heic_output_path}\")\n    except Exception as e:\n        print(f\"An error occurred while saving to HEIC: {e}\")\nelse:\n    print(f\"Skipping HEIC creation: '{output_path}' not found.\")\n","lang":"python","description":"This quickstart demonstrates how to register HEIF support with Pillow, open an existing HEIF/HEIC image, convert it to JPEG, and then save an image back into the HEIC format. Ensure you have an 'input.heif' file in your working directory or provide a path via `HEIF_INPUT_PATH` environment variable. The `os.environ.get` is used to make it runnable without hardcoding paths.","tag":null,"tag_description":null,"last_tested":"2026-04-24","results":[{"runtime":"python:3.10-alpine","exit_code":0},{"runtime":"python:3.10-slim","exit_code":0},{"runtime":"python:3.11-alpine","exit_code":0},{"runtime":"python:3.11-slim","exit_code":0},{"runtime":"python:3.12-alpine","exit_code":0},{"runtime":"python:3.12-slim","exit_code":0},{"runtime":"python:3.13-alpine","exit_code":0},{"runtime":"python:3.13-slim","exit_code":0},{"runtime":"python:3.9-alpine","exit_code":0},{"runtime":"python:3.9-slim","exit_code":0}]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-13","installed_version":"1.1.1","pypi_latest":"1.3.0","is_stale":true,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":2.4,"avg_import_s":0.13,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pillow-heif","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.09,"mem_mb":3.8,"disk_size":"66.8M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pillow-heif","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.1,"mem_mb":3.8,"disk_size":"66.8M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pillow-heif","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.5,"import_time_s":0.06,"mem_mb":3.8,"disk_size":"64M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pillow-heif","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.09,"mem_mb":3.8,"disk_size":"64M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pillow-heif","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.2,"mem_mb":4.4,"disk_size":"69.3M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pillow-heif","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.22,"mem_mb":4.4,"disk_size":"69.3M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pillow-heif","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.3,"import_time_s":0.17,"mem_mb":4.4,"disk_size":"67M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pillow-heif","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.17,"mem_mb":4.4,"disk_size":"67M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pillow-heif","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.14,"mem_mb":4.4,"disk_size":"61.1M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pillow-heif","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.18,"mem_mb":4.4,"disk_size":"61.1M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pillow-heif","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.1,"import_time_s":0.14,"mem_mb":4.4,"disk_size":"59M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pillow-heif","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.16,"mem_mb":4.4,"disk_size":"59M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pillow-heif","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.13,"mem_mb":4.6,"disk_size":"60.8M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pillow-heif","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.14,"mem_mb":4.6,"disk_size":"60.7M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pillow-heif","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.2,"import_time_s":0.13,"mem_mb":4.6,"disk_size":"58M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pillow-heif","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.14,"mem_mb":4.6,"disk_size":"58M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pillow-heif","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.09,"mem_mb":3.7,"disk_size":"64.0M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pillow-heif","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.09,"mem_mb":3.7,"disk_size":"64.0M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pillow-heif","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.9,"import_time_s":0.09,"mem_mb":3.7,"disk_size":"62M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pillow-heif","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.08,"mem_mb":3.7,"disk_size":"62M"}]}}