【问题标题】:Image.open() cannot identify image file - Python?Image.open() 无法识别图像文件 - Python?
【发布时间】:2013-10-14 09:21:02
【问题描述】:

我在 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

全部失败!

【问题讨论】:

  • 文件是否存在且格式正确?
  • @kroolik 是的,它确实存在。我通过将它移动到其他地方来测试它的存在,并且错误消息变为“没有这样的文件”。格式为.jpg。在我成功导入之前。
  • 也许尝试使用不同的图像文件?您的图片可能已损坏。
  • 您安装了libjpeg-dev 吗?或者,换句话说,PIL 在安装时是否打印了--- JPEG support available
  • 您需要有库来处理特定的图像扩展。如果您执行pip install -U PIL,则在输出的末尾应该会告诉您哪些扩展可用。另外,我建议卸载PIL 并安装pillow - 它会自动处理将库链接到特定目录。除此之外,它是常规 PIL 的包装器。

标签: python python-imaging-library


【解决方案1】:

我也有同样的问题。

from PIL import Image

而不是

import Image

修复了问题

【讨论】:

  • 不知道为什么这被否决了,但这也对我有用。我差点没试过,因为它是-1。
  • 对我不起作用...虽然我的问题是间歇性的,所以不确定是否合格...
  • img2pdf.py 突然无法再打开 JPEG 时,这对我有用。 谁能解释一下这个导入语句改变行为的原因?我查了一下,site-packages 下唯一的Image.pyPIL 中的那个。我认为from ... import ... 应该与import ... 相同,除了它如何将生成的对象放在全局命名空间中——在这种情况下,它应该完全相同,不是吗?
  • 这对我也有用。但就像 Evgeni 所说的那样,谁能解释为什么会这样?
  • 开启 PIL/ImageTk from PIL import Image 被使用。使用import Image 创建两个Image 模块实例,并且收集的用于处理图像Image.ID 的插件也被复制。一个装满了插件,另一个是空的。您的代码使用空的。更多这里github.com/python-pillow/Pillow/pull/1898
【解决方案2】:

因此,在为这个问题苦苦挣扎了一段时间后,以下内容可以帮助您:

from PIL import Image

而不是

import Image

此外,如果您的图像文件未加载并且您收到“无文件或目录”错误,那么您应该这样做:

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

然后打开文件

image=Image.open(path)

【讨论】:

  • 我已经在做import PIL.Image as PILI,但我仍然遇到同样的错误。当我执行Path(path).exists() 时,文件存在,因为那是真的。我很难理解你建议我们做什么。你能澄清一下吗?
【解决方案3】:

就我而言.. 我的代码中已经包含“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)

【讨论】:

  • 你是怎么open the file in append mode in a loop的?我相信我可能遇到了您所指的相同问题。
  • 我怀疑您是否能够按照您所说的方式修复它。 .open 的代码有一个特定的检查,如果 mode != r 会抛出错误。文档说:`:param mode:模式。如果给定,这个参数必须是“r”。`
  • 类似的方法也适用于我,在我的情况下,多个进程试图访问同一个图像文件
【解决方案4】:

首先,检查你的枕头版本

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

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

【讨论】:

  • 我认为这很有帮助,但我仍然收到错误 FileNotFoundError: [Errno 2] No such file or directory
  • 我使用的是 python 3.7。我尝试了您的命令,但该属性 PILLOW_VERSION 不存在仅供参考。 Python 3 命令python -c 'import PIL; print(PIL.PILLOW_VERSION)'
  • 如何使用 conda 升级枕头?
  • 使用print(PIL.__version__) 我有版本7.0.0。该版本应该抛出错误吗?
【解决方案5】:

就我而言,这是因为我使用的图像存储在 Mac 上,它会生成许多隐藏文件,例如 .image_file.png,所以它们甚至不是我需要的实际图像,我可以放心地忽略警告或删除隐藏文件。这只是我的一个疏忽。

【讨论】:

    【解决方案6】:

    只是给和我有同样问题的人的一个注释。 我一直在使用 OpenCV/cv2 将 numpy 数组导出到 Tiff 中,但是我在使用 PIL Open Image 打开这些 Tiff 时遇到了问题,并且出现了与标题中相同的错误。 问题原来是 PIL Open Image 无法打开通过导出 numpy float64 数组创建的 Tiffs。当我将其更改为 float32 时,PIL 可以再次打开 Tiff。

    【讨论】:

      【解决方案7】:

      在我的情况下,图像在下载过程中损坏(使用 wget 和 github url)

      • 尝试使用来自不同来源的多张图片。 蟒蛇

        从 PIL 导入图像 图片.open()

      【讨论】:

        【解决方案8】:

        如果您在 Windows 上使用 Anaconda,则可以打开 Anaconda Navigator 应用程序并转到 Environment 部分并在已安装的库中搜索 pillow并通过右键单击复选框将其标记为升级到最新版本。

        截图供参考:

        这已修复以下错误:

        PermissionError: [WinError 5] Access is denied: 'e:\\work\\anaconda\\lib\\site-packages\\pil\\_imaging.cp36-win_amd64.pyd'
        

        【讨论】:

          【解决方案9】:

          似乎是权限问题。我面临同样的错误。但是当我从 root 帐户运行它时,它起作用了。因此,要么使用 chmod(在 linux 中)授予对文件的读取权限,要么在以 root 用户身份登录后运行您的脚本。

          【讨论】:

            【解决方案10】:

            在我的情况下,文件夹中有一张空图片。删除空的.jpg后,它工作正常。

            【讨论】:

            • “空图片”是什么意思?你是如何检查它是否为空的?
            • 对我来说,重新下载我的图像数据集解决了这个问题。
            【解决方案11】:

            通常是因为图像文件没有被最后一个程序关闭。

            应该更好用

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

            【讨论】:

              【解决方案12】:

              在我的情况下,图像文件刚刚被写入,需要在打开之前刷新,如下所示:

              img_file.flush() 
              img = Image.open(img_file.name))
              

              【讨论】:

              • 你确定这是正确的吗? .open() 始终以读取模式打开。 :param mode: The mode. If given, this argument must be "r".
              【解决方案13】:

              对于任何扩大规模的人,您可能还检查了您拥有多少个文件描述符。如果你在糟糕的时刻用完,它会抛出这个错误。

              【讨论】:

                【解决方案14】:

                对于在 Google Colab 中遇到错误 colab PIL UnidentifiedImageError: cannot identify image file 并使用新的 PIL 版本且之前的解决方案均不适用于他的人:

                只需重启环境,你安装的PIL版本可能已经过时了。

                【讨论】:

                  【解决方案15】:

                  对我来说,它是通过下载我再次使用的图像数据集来解决的(事实上,我使用 vs-code 的 SFTP 转发了我在本地拥有的副本)。这是我使用的 jupyter notebook(在 vscode 中)及其输出:

                  from pathlib import Path
                  
                  import PIL
                  import PIL.Image as PILI
                  #from PIL import Image
                  
                  print(PIL.__version__)
                  
                  img_path = Path('PATH_UR_DATASET/miniImagenet/train/n03998194/n0399819400000585.jpg')
                  print(img_path.exists())
                  img = PILI.open(img_path).convert('RGB')
                  
                  print(img)
                  

                  输出:

                  7.0.0
                  True
                  <PIL.Image.Image image mode=RGB size=158x160 at 0x7F4AD0A1E050>
                  

                  请注意,open 始终以 r 模式打开,甚至可以检查以在该模式更改时抛出错误。

                  【讨论】:

                    【解决方案16】:

                    在我的情况下,错误是由 TIFF 文件中的 alpha 通道引起的。

                    【讨论】:

                    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
                    • 这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
                    【解决方案17】:

                    尝试使用 PIL 打开多波段图像时也会出现此错误。它似乎对 4 个波段很好(可能是因为它假设一个 alpha 通道),但除此之外,这个错误就会弹出。就我而言,我改用 tifffile.imread 来修复它。

                    【讨论】:

                      猜你喜欢
                      • 2016-09-03
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-12-17
                      • 2020-05-26
                      • 2017-09-11
                      • 2015-09-05
                      • 1970-01-01
                      相关资源
                      最近更新 更多