事情本身不复杂,线索都在日志里。在 Windows 上用 opencv-python 4.10 的 imread 读用户上传的 HEIC 照片,返回值一直是 None,same 文件用系统照片查看器能打开,转成 jpg 后 imread 就正常。
第一反应是「文件是 HEIF 序列的第一帧,扩展名却是 heic」,验证下来不成立。
把日志和配置对完,能解释这个现象的基本就这几处。OpenCV 默认编译不带 HEIC 解码器。另一种情况是路径里有中文,imread 在 Windows 下按 ANSI 解析失败。
不容易想到的是,numpy 版本与 opencv 轮子不匹配导致解码静默失败。
上来先确认文件真实格式
python -c "print(open('a.heic','rb').read(12))"
接着改用 pillow-heif 注册解码器再读
python -c "import pillow_heif;pillow_heif.register_heif_opener();from PIL import Image;print(Image.open('a.heic').size)"
再往下统一转成 jpg 落盘再进后续流程
python -c "from PIL import Image;Image.open('a.heic').convert('RGB').save('a.jpg',quality=92)"
剩下的就是用 imdecode 绕开中文路径问题
python -c "import cv2,numpy as np;print(cv2.imdecode(np.fromfile('a.jpg',dtype=np.uint8),1).shape)"
改完先别撤,确认这几项。HEIC 文件经转换后能正常读出宽高和像素,后续检测流程不再返回 None,批处理 100 张零失败。
imread 返回 None 不代表文件坏了,先看容器格式,再看路径编码,这两点能覆盖绝大多数情况。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
