OpenCV的imdecode读取HEIC文件返回None的问题如何解决?
问题原因
OpenCV 原生未内置 HEIC/HEIF 格式的解码能力,读取 HEIC 文件时cv2.imdecode会直接返回 None,后续传入cvtColor时触发空值断言报错。
解决方案
方案1:使用 pyheif 单独处理 HEIC 格式
该方案性能更高,适合处理大体积 HEIC 文件:
- 安装依赖:
pip install pyheif
- 调整代码逻辑,增加 HEIC 格式分支:
import pyheif import numpy as np import cv2 from PIL import Image # 先判断文件格式,可通过文件名后缀、文件头信息获取格式标识 file_format = 获取当前文件格式的逻辑 if file_format.lower() in ("heic", "heif"): heif_data = pyheif.read(stream) img = Image.frombytes( heif_data.mode, heif_data.size, heif_data.data, "raw", heif_data.mode, heif_data.stride, ) img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) else: npimg = np.frombuffer(stream.read(), np.uint8) img = cv2.imdecode(npimg, cv2.IMREAD_COLOR) # 后续原有处理逻辑保持不变 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) h, w = cls.get_dims(img, dpi) img = cv2.resize(img, (w, h), interpolation=cv2.INTER_AREA) return Image.fromarray(img).convert("RGB")
方案2:给 Pillow 注册 HEIC 支持,统一读取逻辑
该方案无需单独做格式分支判断,代码更简洁:
- 安装依赖:
pip install pillow-heif
- 调整统一读取逻辑:
from pillow_heif import register_heif_opener from PIL import Image import numpy as np import cv2 # 全局注册一次 HEIF 格式支持即可 register_heif_opener() # 所有格式统一走该读取逻辑 img = Image.open(stream).convert('RGB') img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) # 后续原有处理逻辑保持不变 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) h, w = cls.get_dims(img, dpi) img = cv2.resize(img, (w, h), interpolation=cv2.INTER_AREA) return Image.fromarray(img).convert("RGB")
内容的提问来源于stack exchange,提问作者Sudip Bolakhe
相关产品推荐
相关产品推荐

