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

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扩展:
    pip install pillow-heif
    
    安装后直接用原有代码即可读取HEIC图片:
    from PIL import Image
    img = Image.open(path)
    

方法三:验证路径与权限

确保路径无拼写错误,同时检查文件读取权限:

import os
print(os.access(path, os.R_OK))  # 返回True表示拥有读取权限

内容的提问来源于stack exchange,提问作者ganeshravisankar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:10:43