Image.open()无法识别图像文件 - Python?

69

我正在Visual Studio 2013中运行Python 2.7。在Spyder中,代码之前能够正常工作,但是当我运行以下命令时:

import numpy as np
import scipy as sp
import math as mt
import matplotlib.pyplot as plt
import Image
import random

# (0, 1) is N
SCALE = 2.2666 # the scale is chosen to be 1 m = 2.266666666 pixels
MIN_LENGTH = 150 # pixels

PROJECT_PATH = 'C:\\cimtrack_v1'
im = Image.open(PROJECT_PATH + '\\ST.jpg')

我最终遇到以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\cimtrack_v1\PythonApplication1\dr\trajgen.py", line 19, in <module>
    im = Image.open(PROJECT_PATH + '\\ST.jpg')
  File "C:\Python27\lib\site-packages\PIL\Image.py", line 2020, in open
    raise IOError("cannot identify image file")
IOError: cannot identify image file

为什么会这样,我该怎么解决?


按照建议,我在我的Python 2.7中使用了Pillow安装程序。但是奇怪的是,我最终得到了这个结果:

>>> from PIL import Image
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named PIL


>>> from pil import Image
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named pil

>>> import PIL.Image
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named PIL.Image

>>> import PIL
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named PIL

全部失败!


文件是否存在且格式正确? - Maciej Gol
@kroolik 是的,它确实存在。我通过将其移动到其他位置来测试其存在性,错误消息变为“没有这样的文件”。格式是 .jpg。在此之前,我已经成功导入了它。 - Sibbs Gambling
1
也许尝试使用不同的图像文件?你的图像可能已损坏。 - Tyler
2
你安装了libjpeg-dev吗?换句话说,当你安装PIL时,它是否打印了“--- JPEG support available”? - Maciej Gol
3
你需要使用特定的库来处理不同的图像格式。如果你执行 pip install -U PIL 命令,输出结果末尾将告诉你可用的格式类型。此外,我建议卸载 PIL 并安装 pillow 替换它,这将自动处理将库链接到特定目录的问题。除此之外,它和普通的 PIL 差不多,只是一个包装器。 - Maciej Gol
显示剩余6条评论
21个回答

73

我也遇到了同样的问题。

from PIL import Image

而不是

import Image

修复了问题


2
不确定为什么这个被踩了,但这对我也起作用了。因为它是-1,所以我差点没试。 - Leah Sapan
30
对我来说没有用…虽然我的问题是间歇性的,所以不确定是否符合要求… - Deep-B
4
img2pdf.py 突然无法打开 JPEG 文件时,这个方法对我很有用。有人能解释一下为什么这个导入语句的更改会改变程序的行为吗?我检查了一下,在 site-packages 目录下唯一的 Image.py 是在 PIL 中的那一个。我认为 from ... import ... 应该和 import ... 的功能完全相同,除了它将生成的对象放置在全局命名空间中的方式不同之外——但在这种情况下,两者应该是完全相同的,是吗? - Evgeni Sergeev
2
这个对我也起作用了。但就像Evgeni说的那样,有人能解释一下为什么会有效吗? - irenemeanspeace
4
在使用PIL/ImageTk时,应该使用from PIL import Image。如果使用import Image,会创建两个Image模块实例,并且收集插件以处理图像的Image.ID也会重复。其中一个被填充了插件,另一个是空的。您的代码使用了空的那个实例。更多信息请参见https://github.com/python-pillow/Pillow/pull/1898。 - albfan
显示剩余2条评论

14

所以在苦苦挣扎了一段时间后,以下内容可能会对你有帮助:

from PIL import Image

取代

import Image

另外,如果您的图像文件未加载并出现“无文件或目录”错误,则应执行以下操作:

Also,如果你的Image文件没有加载并且出现了一个“没有文件或目录”的错误,那么你应该这样做:

path=r'C:\ABC\Users\Pictures\image.jpg'

然后打开文件

image=Image.open(path)

2
我已经使用import PIL.Image as PILI,但仍然遇到相同的错误。当我执行Path(path).exists()时,它会打印true,表示文件存在。我很难理解你建议我们做什么。你能否澄清一下? - Charlie Parker

14

在我的情况下,我已经在我的代码中使用了“from PIL import Image”。

出现错误是因为图像文件仍被我代码中的先前操作使用(锁定)。我不得不添加一个小延迟或尝试以追加模式在循环中打开该文件,直到不再失败为止。一旦这样做不会失败,就意味着该文件不再被使用,我就可以继续让PIL打开文件。以下是我用于检查文件是否在使用并等待其可用的函数。

def is_locked(filepath):
    locked = None
    file_object = None
    if os.path.exists(filepath):
        try:
            buffer_size = 8
            # Opening file in append mode and read the first 8 characters.
            file_object = open(filepath, 'a', buffer_size)
            if file_object:
                locked = False
        except IOError as message:
            locked = True
        finally:
            if file_object:
                file_object.close()
    return locked

def wait_for_file(filepath):
    wait_time = 1
    while is_locked(filepath):
        time.sleep(wait_time)

你是如何在循环中以追加模式打开文件的?我认为我可能遇到了你所提到的同样问题。 - Charlie Parker
我对你所说的修复方式持怀疑态度。.open的代码有一个特定的检查,如果mode!= r则会抛出错误。文档中写道::param mode:模式。如果提供这个参数,则必须是“r”。 - Charlie Parker
1
在我的情况下,类似的方法也适用于我,因为多个进程尝试访问同一个图像文件。 - yazan sayed
@CharlieParker 你试过我的代码了吗?在我的情况下它完美地工作。 - panofish

8

首先,检查您的Pillow版本

python -c 'import PIL; print PIL.PILLOW_VERSION'

我使用pip install --upgrade pillow将版本从2.7升级到2.9(或3.0)解决了这个问题。

我认为这很有帮助,但我仍然收到“FileNotFoundError:[Errno 2]找不到文件或目录”的错误。 - Philip
我正在使用Python 3.7。我尝试了您的命令,但是那个属性PILLOW_VERSION不存在,供您参考。Python 3 命令 python -c 'import PIL; print(PIL.PILLOW_VERSION)' - Charlie Parker
你如何使用conda升级pillow? - Charlie Parker
3
使用print(PIL.__version__)我得到的版本是7.0.0。这个版本是否应该会出现错误? - Charlie Parker
升级总是必要的,我想这就是为什么虚拟环境如此重要。 - jth_92

6

在我的情况下,使用wget下载Github链接的镜像时出现了损坏。

  • 尝试使用来自不同源的多个镜像。

    python

    from PIL import Image Image.open()


4

通常是因为图像文件没有被上一个程序关闭导致该问题出现。

最好使用

with Image.open(file_path) as img:
    #do something

是的,这正是我的情况。我在 For 循环中下载并调整图像列表的大小,但是在解析每个图像后没有关闭它。最终我这样做:<code> image = Image.open(my_file) ...do stuff... Image.close() </code> - VA13

2
在我的情况下,是因为我使用的图片存储在Mac上,它会生成许多隐藏文件,例如.image_file.png,因此它们实际上并不是我需要的真正的图片,我可以安全地忽略警告或删除隐藏文件。这只是我的疏忽。最初的回答。

2

对于遇到和我一样的问题的人,我想提醒一下。 我一直在使用OpenCV/cv2将numpy数组导出为Tiff文件,但是在使用PIL Open Image打开这些Tiff文件时遇到了问题,并且出现了与标题中相同的错误。 问题最终被发现是由于PIL Open Image无法打开由导出的numpy float64数组创建的Tiff文件。当我将其更改为float32时,PIL就可以再次打开Tiff文件。


1
如果您在Windows上使用Anaconda,则可以打开Anaconda Navigator应用程序,转到环境部分,并在已安装的库中搜索pillow,然后通过右键单击复选框将其标记为最新版本进行升级。
参考截图:enter image description here 这解决了以下错误:
PermissionError: [WinError 5] Access is denied: 'e:\\work\\anaconda\\lib\\site-packages\\pil\\_imaging.cp36-win_amd64.pyd'

1

我也遇到了同样的问题。在我的情况下,图像文件大小为0(零)。在打开图像之前,请检查文件大小。

fsize = os.path.getsize(fname_image)
if fsize > 0 :       
    img = Image.open(fname_image)
    #do something

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接