Using HeifFile
Opening
if pillow_heif.is_supported("image.heif"):
heif_file = pillow_heif.open_heif("image.heif")
open_heif is preferred over read_heif, it does not decode images immediately.
All image data supports lazy loading and will be automatically decoded when you request it,
e.g. when access to data property occurs.
Creating from Pillow
heif_file = pillow_heif.from_pillow(Image.open("image.gif")):
Creating from bytes
import cv2 # OpenCV
cv_img = cv2.imread("image_16bit.png", cv2.IMREAD_UNCHANGED)
heif_file = pillow_heif.from_bytes(
mode="BGRA;16",
size=(cv_img.shape[1], cv_img.shape[0]),
data=bytes(cv_img)
)
Enumerating images
print("number of images in file:", len(heif_file))
for img in heif_file:
print(img)
Note
HeifFile itself points to the primary image in the container.
Adding images
Add all images from second file:
heif_file_to_add = pillow_heif.open_heif("file2.heif")
heif_file.add_from_heif(heif_file_to_add)
Add only first image from second file:
heif_file_to_add = pillow_heif.open_heif("file2.heif")
heif_file.add_from_heif(heif_file_to_add[0])
Add image from Pillow:
heif_file.add_from_pillow(Image.open("file2.jpg"))
Add image from bytes:
heif_file.add_frombytes(
mode="BGRA", # depends on image in `cv_img`
size=(cv_img.shape[1], cv_img.shape[0]),
data=bytes(cv_img)
)
Removing images
Remove image at position with index 0:
del heif_file[0]
Saving
Refer to save() to see what additional parameters is supported and to Saving images.
heif_file.save("output.heif", quality=-1)
cv_img = cv2.imread("images/non_heif/RGBA_16__128x128.png", cv2.IMREAD_UNCHANGED)
pillow_heif.encode(
mode="BGRA;16",
size=(cv_img.shape[1], cv_img.shape[0]),
data=bytes(cv_img),
fp="RGBA_10bit.heic",
quality=-1)
Accessing image data
Decoded image data available throw data property.
Accessing Primary image in a file:
print(len(heif_file.data))
Or you can access image by index:
print(len(heif_file[0].data))
Numpy array interface
Next code gets decoded primary image data as a numpy array(in the same format as Pillow does):
heif_file = pillow_heif.open_heif("file.heif")
np_array = np.asarray(heif_file)
Accessing image by index(for multi-frame images):
heif_file = pillow_heif.open_heif("file.heif")
np_array = np.asarray(heif_file[0]) # accessing image by index.
After that you can load it at any library that supports numpy arrays.