How to work with HEIC image file types in Python

python libheif
pil image format
pil image save quality
pil save image as png
how to convert heic to jpg
imagemagick heic to jpg
ffmpeg heic to jpg

The High Efficiency Image File (HEIF) format is the default when airdropping an image from an iPhone to a OSX device. I want to edit and modify these .HEIC files with Python.

I could modify phone settings to save as JPG by default but that doesn't really solve the problem of being able to work with the filetype from others. I still want to be able to process HEIC files for doing file conversion, extracting metadata, etc. (Example Use Case -- Geocoding)


Here is the result of working with Python 3.7 and Pillow when trying to read a file of this type.

$ ipython
Python 3.7.0 (default, Oct  2 2018, 09:20:07)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from PIL import Image

In [2]: img ='IMG_2292.HEIC')
OSError                                   Traceback (most recent call last)
<ipython-input-2-fe47106ce80b> in <module>
----> 1 img ='IMG_2292.HEIC')

~/.env/py3/lib/python3.7/site-packages/PIL/ in open(fp, mode)
   2685         warnings.warn(message)
   2686     raise IOError("cannot identify image file %r"
-> 2687                   % (filename if filename else fp))
   2689 #

OSError: cannot identify image file 'IMG_2292.HEIC'

It looks like support in python-pillow was requested (#2806) but there are licensing / patent issues preventing it there.

ImageMagick + Wand

It appears that ImageMagick may be an option. After doing a brew install imagemagick and pip install wand however I was unsuccessful.

$ ipython
Python 3.7.0 (default, Oct  2 2018, 09:20:07)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from wand.image import Image

In [2]: with Image(filename='img.jpg') as img:
   ...:     print(img.size)
(4032, 3024)

In [3]: with Image(filename='img.HEIC') as img:
   ...:     print(img.size)
MissingDelegateError                      Traceback (most recent call last)
<ipython-input-3-9d6f58c40f95> in <module>
----> 1 with Image(filename='ces2.HEIC') as img:
      2     print(img.size)

~/.env/py3/lib/python3.7/site-packages/wand/ in __init__(self, image, blob, file, filename, format, width, height, depth, background, resolution, pseudo)
   4603           , resolution=resolution)
   4604                 elif filename is not None:
-> 4605           , resolution=resolution)
   4606                 # clear the wand format, otherwise any subsequent call to
   4607                 # MagickGetImageBlob will silently change the image to this

~/.env/py3/lib/python3.7/site-packages/wand/ in read(self, file, filename, blob, resolution)
   4894             r = library.MagickReadImage(self.wand, filename)
   4895         if not r:
-> 4896             self.raise_exception()
   4898     def save(self, file=None, filename=None):

~/.env/py3/lib/python3.7/site-packages/wand/ in raise_exception(self, stacklevel)
    220             warnings.warn(e, stacklevel=stacklevel + 1)
    221         elif isinstance(e, Exception):
--> 222             raise e
    224     def __enter__(self):

MissingDelegateError: no decode delegate for this image format `HEIC' @ error/constitute.c/ReadImage/556

Any other alternatives available to do a conversion programmatically?

You guys should check out this library, it's a Python 3 wrapper to the libheif library, it should serve your purpose of file conversion, extracting metadata:

Example usage:

 import whatimage
 import pyheif
 from PIL import Image

 def decodeImage(bytesIo):

    fmt = whatimage.identify_image(bytesIo)
    if fmt in ['heic', 'avif']:
         i = pyheif.read_heif(bytesIo)

         # Extract metadata etc
         for metadata in i.metadata or []:
             if metadata['type']=='Exif':
                 # do whatever

         # Convert to other file format like jpeg
         s = io.BytesIO()
         pi = Image.frombytes(
                mode=i.mode, size=i.size,
, format="jpeg")


Image file formats, The Python Imaging Library supports a wide variety of raster file formats. The order of the images does not matter, as their use is determined by the size of  from PIL import Image import pyheif heif_file = pyheif. read_heif ("IMG_7424.HEIC") image = Image. frombytes (mode = heif_file. mode, size = heif_file. size, data = heif_file. data) image. save ("IMG_7424.jpg", "JPEG")

Adding to the answer by danial, i just had to modify the byte array slighly to get a valid datastream for further work. The first 6 bytes are 'Exif\x00\x00' .. dropping these will give you a raw format that you can pipe into any image processing tool.

import pyheif
import PIL
import exifread

def read_heic(path: str):
    with open(path, 'rb') as file:
        image = pyheif.read_heif(file)
        for metadata in image.metadata or []:
            if metadata['type'] == 'Exif':
                fstream = io.BytesIO(metadata['data'][6:])

    # now just convert to jpeg
    pi ="file.jpg", "JPEG")

    # or do EXIF processing with exifread
    tags = exifread.process_file(fstream)

At least this worked for me.

Support for HEIF · Issue #2806 · python-pillow/Pillow · GitHub, Do you have any plans to support HEIF image format, recently introduced by apple? GitHub is home to over 50 million developers working together to Better support for HEIC/HEIF files created by iOS jmathai/elodie#269. This tool also allows you to right-click an .HEIC file and select “Convert to JPEG” to convert it to a JPEG file. Click this option and you’ll get a .JPEG version of the image automatically placed in the same folder. JPEG files are more widely supported, so this also allows you to share that HEIC image with someone else or import it into

I am facing the exact same problem as you, wanting a CLI solution. Doing some further research, it seems ImageMagick requires the libheif delegate library. The libheif library itself seems to have some dependencies as well.

I have not had success in getting any of those to work as well, but will continue trying. I suggest you check if those dependencies are available to your configuration.

How to convert HEIC to PNG in Python - Cloudmersive, Your image will be converted. Note the wide array of different compatible file formats. Apple has introduced a new image format in iOS 11 called HEIF (.heic file extension). I know you can export images as JPG from iOS devices, but I want to upload the HEIC-files to my server and convert them there to JPEG files that can be shown on all other devices.

This will do go get the exif data from the heic file

import pyheif
import exifread
import io

heif_file = pyheif.read_heif("file.heic")

for metadata in heif_file.metadata:

    if metadata['type'] == 'Exif':
        fstream = io.BytesIO(metadata['data'][6:])

    exifdata = exifread.process_file(fstream,details=False)

    # example to get device model from heic file
    model = str(exifdata.get("Image Model"))

cykooz.heif · PyPI, A decoder of HEIF format of images. cykooz.heif is simple python wrapper for the library libheif-rs. Read HEIF-image from file-like object: Windows will now be able to recognize and open HEIC files. Even better, you will be able to see thumbnails of the images in File Explorer. Note, however, the extremely low ratings that Microsoft has received on the HEIC add-on; with more than 200 votes and an average score of 1.5 stars, it’s clear that the user community is far from a HEIC revolution taking over the Windows 10 world and

Python heic metadata, golang hevc heif Mac OS X: Convert any image to HEIF/HEIC format. So HEIC Easy to use Python module to extract Exif metadata from tiff and jpeg files. The High Efficiency Image File (HEIF) format is the default when airdropping an image from an iPhone to a OSX device. I want to edit and modify these .HEIC files with Python.

Python read heic, The High Efficiency Image File (HEIF) format is the default when airdropping an image from an iPhone to a OSX device. I want to edit and modify these .HEIC  물론 크롬 등 모던 브라우저에서 heic 파일을 열 수 있지만, 원칙적으로 윈도우(윈도우 10 포함)에서는 별도의 코덱을 설치해야 합니다.heic 파일을 jpg로 변환하는 방법으로 다음과 같은 방법이 있습니다.1.

Python convert heic, Atom/Hydrogen or VSCode/Python allows creating a python files split into cells Use JavaScript to Convert HEIC or HEIF image formats to PNG in the browser. Click the UPLOAD FILES button and select up to 20.heic images you wish to convert. You can also drag files to the drop area to start uploading. Take a break now and let our tool upload your files and convert them one by one, automatically choosing the proper compression parameters for every file.

  • Similarly Sindre Sorhus has an excellent HEIC Converter to generate JPEG or PNG images but not the flexibility I'm looking for.
  • ExifTool provides a CLI for working with image metadata and supports HEIF. Should be easy to wrap in Python.
  • This may help...
  • My experience with pyheif is that it successfully reads HEIC files, but I don't understand how or why Image.frombytes() is supposed to work in the code above. Wouldn't that require PIL to understand HEIF? In any event, what I get is a badly corrupted JPG file when I run it.
  • read_heif required actual data, so the line should actually be: pyheif.read_heif(
  • can you give some examples of the do whatever? metadata['data'] here appears to be of type bytes. But when I attempt to: metadata['data'].decode('utf-8')), I see: UnicodeDecodeError: 'utf-8' codec can't decode byte 0x86 in position 27: invalid start byte
  • fwiw, I tried to install pyheif on windows and ran into this issue. Turns out pyheif is not compatible with Windows.
  • This may help
  • Thank you for this Mark, it will prove useful.