python-3.x 在Windows 11上使用PIL.Image打开图像文件时出现问题

gjmwrych  于 2023-11-20  发布在  Python
关注(0)|答案(1)|浏览(199)

我尝试使用PIL.Image打开图像,但遇到此错误:

Python 3.11.4 (tags/v3.11.4:d2340ef, Jun  7 2023, 05:45:37) [MSC v.1934 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.listdir(".")
['Characters', 'Creatures', 'processing.ipynb']
>>> picpath = os.path.join("Characters", "4sprite", "Female_Archer", "Archer_Base", "Sprite_1.png")
>>> os.path.exists(picpath)
True
>>> from PIL import Image
>>> img = Image.open(picpath)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\Alex\AppData\Local\Programs\Python\Python311\Lib\site-packages\PIL\Image.py", line 3305, in open
    raise UnidentifiedImageError(msg)
PIL.UnidentifiedImageError: cannot identify image file 'Characters\\4sprite\\Female_Archer\\Archer_Base\\Sprite_1.png'

字符串
我现在最好的猜测是,它与PIL在Windows上处理路径的方式有关,因为os.path.exists会找到该文件(我已经手动验证了文件存在,可以打开和查看).我注意到路径有双反斜杠,但我发现的resources说,这是规范的表示.我看到有人遇到了similar problem,但不幸的是,他们的解决方案是使用PIL.Image.open(这就是我抛出错误的原因)。
有没有其他人遇到过这种情况,并在周围工作?
问:Sprite_1.png是什么类型的图像(编码,通道数和大小)?它实际上是一个有效格式的PNG吗?你能给我们看前一百个字节吗?-Brian 61354270
答:

with open(os.path.join("Characters", "4sprite", "Female_Archer", "Archer_Base", "Sprite_1.png"), "rb") as f:
     first_100 = f.read(100)
print(first_100)


给出b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x0f\x00\x00\x00\x0f\xa0\x08\x06\x00\x00\x00G'\xe9\xd3\x00\x00a.zTXtRaw profile type exif\x00\x00x\xda\xac\xbdY\x92\xc48\xb6m\xf7\xcfQ\xbc!\x10=8\x1c\x00$\xcc4\x03\r_k\xc1#\xab\xea\xdew%3\xc9"

ssm49v7z

ssm49v7z1#

似乎有几种可能性:

  • PIL无法理解文件的路径,或者
  • PIL可以理解文件的路径,但不能理解其内容。

共享文件,使用Dropbox/Github/Google Drive或其他不会更改文件的服务会有所帮助。
要检查第一种可能性,您可以自己读取文件并将其传递给PIL,这样PIL就不必处理您的路径。这将像这样:

# Slurp entire file
with open(os.path.join("Characters", "4sprite", "Female_Archer", "Archer_Base", "Sprite_1.png"), "rb") as f:
    data = f.read()

from io import BytesIO

# Wrap bytes in a BytesIO and pass to PIL
im = Image.open(BytesIO(data))

字符串
如果这样做有效,这意味着PIL可以理解文件内容,但不能通过您的路径访问它们。如果不起作用,则文件内容有问题,您需要共享它。
另一种可能更简单的方法来测试路径是否是问题所在,就是简单地将图像移动到程序运行的目录中。
一种测试图像内容是否是问题所在的方法,与路径相反,是在原始路径上放置一个简单的2x2像素黑色PNG图像,以代替您的 “不满意” 图像。

相关问题