You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV的imdecode读取HEIC文件返回None的问题如何解决?

问题原因

OpenCV 原生未内置 HEIC/HEIF 格式的解码能力,读取 HEIC 文件时cv2.imdecode会直接返回 None,后续传入cvtColor时触发空值断言报错。

解决方案

方案1:使用 pyheif 单独处理 HEIC 格式

该方案性能更高,适合处理大体积 HEIC 文件:

  1. 安装依赖:
pip install pyheif
  1. 调整代码逻辑,增加 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 支持,统一读取逻辑

该方案无需单独做格式分支判断,代码更简洁:

  1. 安装依赖:
pip install pillow-heif
  1. 调整统一读取逻辑:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:36:03