OSError: cannot identify image file

讲在前面:

本文实操是在ubuntu系统下,python版本3.5,使用pillow工具from PIL import Image,一开始在环境里没有pillow,后来install了当前最新版本6.0.0。

问题描述:

在使用Image.open(‘*.jpg’)时,Console发出如题错误信息,即“不能识别图片文件”。具体错误信息如下所示:

runfile('/home/JiehuaPeng/Project/2019.06/Program/resizePic02.py', wdir='/home/JiehuaPeng/Project/2019.06/Program')
Traceback (most recent call last):

  File "", line 1, in 
    runfile('/home/JiehuaPeng/Project/2019.06/Program/resizePic02.py', wdir='/home/JiehuaPeng/Project/2019.06/Program')

  File "/home/JiehuaPeng/anaconda3/envs/tensorflow/lib/python3.5/site-packages/spyder/utils/site/sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "/home/JiehuaPeng/anaconda3/envs/tensorflow/lib/python3.5/site-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/home/JiehuaPeng/Project/2019.06/Program/resizePic02.py", line 26, in 
    img = Image.open(imgPath)

  File "/home/JiehuaPeng/anaconda3/envs/tensorflow/lib/python3.5/site-packages/PIL/Image.py", line 2705, in open
    % (filename if filename else fp))

OSError: cannot identify image file '/home/JiehuaPeng/Desktop/train/A0062/QZ_20180322_00293_0.jpg'

错误原因:

见诸另一篇博客[1],该文博主提出,此类错误表明“操作系统不能执行指定的任务(如打开文件)时引发的,有多个子类”。进一步地,他的解决方案是使用try-except来跳过不能正常打开的图片,从而不中断程序对于那些能够正常打开图片的处理工作,具体可参看参考博客的细节。

但上面提到的博客并没有深究错误原因,笔者在后续search for solution的时候发现了一篇来自台湾同胞的深“究”好文[2](好像需要),该文博主打破砂锅、究跟问底的气力让笔者感到惭愧。该文主要说明了以下一个问题:

①cv2.imread()仿佛比Image.open()要友好一些,它能够打开.jpg文件格式的图片,而后者如果想要打开.jpg图片,恐怕需要注意pillow的版本问题!!

②探究了pillow与PIL的关系,回答了“明明我们pip的包是pillow,但实际调用时却是使用from PIL”(因为安装后的文件夹的名称都是PIL)。

③matplotlib的读图方式:matplotlib的原生读图程式只能读.png档;如果是.png以外的档案,matplotlib则会调用Pillow来读图。

在知乎的一个问答[3]中,答者拿铁轮说道“如果你的PIL是最新版,查官方文档就可以知道open函数不支持jpg图片”。我们也能发现,确乎是pillow版本在作祟。综合上一篇台湾同胞的博客,pillow的版本不能太旧也不能太新。台湾同胞给出的pillow版本是5.3.0,fit me!

My Solution:

pip install pillow==5.3.0

将原先install的高版本pillow替换为较低版本的5.3.0。

参考资料:

 

[1]OSError: cannot identify image file

[2]PIL及matplotlib:OSError: cannot identify image file错误及解决方式 - 台部落

[3]OSError: cannot identify image file? - 知乎

[4]OSError: cannot identify image file png · Issue #3287 · python-pillow/Pillow

[5]Image.open() cannot identify image file - Python? - Stack Overflow

[6]Image Module — Pillow (PIL Fork) 4.2.1 documentation

[7]Pillow (PIL Fork) 5.1.0.dev0 documentation

ps:

如果本文的错误情况与你的不太相同,参考资料中的[4]、[5]也许能帮你找到你的同类。[6]、[7]分别是Image.open()、Pillow的官方文档,debug的究极大法就是研究官方文档了。祝你好运!

 

你可能感兴趣的:(DEBUG)