苹果给我们带来了更强大的 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-strea
m。
嗯……升级服务去了……这样就能吹一波「我们的服务支持主流文件格式」了。
发表回复