iPhone拍摄的JPEG无法用OpenCV/Pillow读取的问题排查与解决
UnidentifiedImageError Traceback (most recent call last)
Input In [14], in <cell line: 3>()
1 from PIL import Image
----> 3 img = Image.open(path)
File ~/opt/anaconda3/lib/python3.9/site-packages/PIL/Image.py:3283, in open(fp, mode, formats)
3281 warnings.warn(message)
3282 msg = "cannot identify image file %r" % (filename if filename else fp)
-> 3283 raise UnidentifiedImageError(msg)
UnidentifiedImageError: cannot identify image file '/Users/admin/work/img_2581.jpg'
注:图片可正常通过系统预览打开,但无法通过上述Python库加载,存在以下疑问: 1. 图片存在的情况下,为何OpenCV中`img`的值为`None`? 2. Pillow抛出`UnidentifiedImageError`的原因是什么? 3. 如何解决这些问题? --- ## 解答与解决方案 ### 1. OpenCV返回`None`的原因 `cv2.imread()`返回`None`的核心原因是**图片格式不兼容**:iPhone默认拍摄的是HEIC格式图片,即便你将后缀改为`.jpg`,文件内部编码仍是HEIC,而OpenCV默认不支持HEIC解码。此外,极少数情况可能是文件权限不足或路径包含隐藏字符,但从你的操作来看,这两种可能性极低。 ### 2. Pillow抛出`UnidentifiedImageError`的原因 和OpenCV的问题本质一致: - 图片实际为HEIC格式,后缀名被改为`.jpg`,Pillow无法识别HEIC编码内容; - 若你的Pillow版本较旧,本身也未内置HEIC解码支持。 ### 3. 解决方法 #### 方法一:转换图片格式(最简单直接) 用系统预览打开图片,选择「文件」→「导出」,将格式改为JPG或PNG后保存,之后即可用OpenCV或Pillow正常读取。 #### 方法二:安装HEIC支持库 如果不想转换图片,可以安装对应库扩展解码能力: - **针对OpenCV**:安装`pyheif`库将HEIC转为OpenCV可读格式: ```bash pip install pyheif opencv-python
使用代码:
import pyheif import cv2 import numpy as np heif_file = pyheif.read(path) img_rgb = np.array(heif_file.direct_read()) img_bgr = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2BGR) # OpenCV默认用BGR格式 print(img_bgr.shape)
- 针对Pillow:安装
pillow-heif扩展:
安装后直接用原有代码即可读取HEIC图片:pip install pillow-heiffrom PIL import Image img = Image.open(path)
方法三:验证路径与权限
确保路径无拼写错误,同时检查文件读取权限:
import os print(os.access(path, os.R_OK)) # 返回True表示拥有读取权限
内容的提问来源于stack exchange,提问作者ganeshravisankar
相关产品推荐
相关产品推荐

