处理 HEIC 格式的图片

苹果给我们带来了更强大的 HEIC 图片格式,也给我们带来了一大堆麻烦。

HEIC 不能算是太新的格式吧,但确实是随着 iOS13 的到来才逐渐流行起来。

但是,目前,从 OpenCV,到 PIL,再到 ImageIO,都无法直接处理这个格式。

于是我们需要借助 pyhied 这个专门的包来实现对 HEIC 图片的读取。

from pathlib import Path

import cv2
import numpy as np
import pyheif

img_path = Path("some/image.HEIC")

img_binary = img_path.open("rb").read()
heif_file = pyheif.read(img_binary) # 当然也能直接写文件地址,或者传入一个文件对象

然后我们可以将它转成熟悉的 OpenCV 格式

img = np.frombuffer(heif_file.data, dtype=np.uint8).reshape(*reversed(heif_file.size), -1)
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)

也可以转换成 PIL Image

img = Image.frombytes(mode=i.mode, size=i.size, data=i.data)

那么如何判断这是个 HEIC 图片呢?这个使用 Magic 来判断就成:

import magic

filetype = magic.from_buffer(img_binary, mime=True) # filetype="image/heic"

注意有个小坑哈~如果系统比较老,那么 magic 也是不认它的,会得到 application/octet-stream。


嗯……升级服务去了……这样就能吹一波「我们的服务支持主流文件格式」了。

发表评论