PIL.UnidentifiedImageError:无法识别图像文件

Posted

技术标签:

【中文标题】PIL.UnidentifiedImageError:无法识别图像文件【英文标题】:PIL.UnidentifiedImageError: cannot identify image file 【发布时间】:2020-05-26 20:43:43 【问题描述】:

我正在研究 GCP 云函数,并打算编写一个组合两个图像的函数。但是,当我调用该函数时,出现以下错误:

Traceback(最近一次调用最后一次):文件 "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", 第 346 行,在 run_http_function 结果 = _function_handler.invoke_user_function(flask.request) 文件“/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py”, 第 217 行,invoke_user_function 返回 call_user_function(request_or_event) 文件 "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", 第 210 行,在 call_user_function 中返回 self._user_function(request_or_event) 文件“/user_code/main.py”,行 74、在执行newIntro=generateIntroImage(nameMappings['stdName'], nameMappings['stdPicture'], nameMappings['logo'], nameMappings['stdYear'], nameMappings['font']) 文件 “/user_code/main.py”,第 12 行,在 generateIntroImage 中 images.append(Image.open(logo)) 文件 “/env/local/lib/python3.7/site-packages/PIL/Image.py”,第 2862 行,在 open "cannot identify image file %r" % (filename if filename else fp) PIL.UnidentifiedImageError: 无法识别图像文件'/tmp/logo.jpg'

我已经在我的本地机器上运行了这个函数,它按预期工作,但是当我在 GCP 上部署它时,它会出现这个错误并崩溃。这是我的功能:

from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw

def generateIntroImage(stdName, stdPicture, logo, year, typeFace):
    images = [Image.open(x) for x in [stdPicture, logo]]
    widths, heights = zip(*(i.size for i in images))
    total_width = sum(widths)
    max_height = max(heights)
    new_im = Image.new('RGB', (total_width, max_height))
    x_offset = 0
    for im in images:
        new_im.paste(im, (x_offset,0))
        x_offset += im.size[0]

    font= ImageFont.truetype(typeFace, 70)
    draw= ImageDraw.Draw(new_im)
    draw.text((0, 0), stdName+"'s " +year+" Year Book", (0,0,0),font= font)
    fileName= "/tmp/test.jpg"
    new_im.save(fileName)
    return fileName

这些图像是 .jpg 和 .png 文件。知道有什么问题吗?

【问题讨论】:

他们的文件扩展名可能是错误的。 我已经手动检查了扩展,它们看起来很好 【参考方案1】:

我在 Google Colab 上也遇到过,显然更新 PIL 版本解决了我的问题。

【讨论】:

【参考方案2】:

PIL 抛出错误,因为它无法识别图像格式。最可能的原因是 图像已损坏,因此枕头的Image.open() 无法读取(或“识别”)。例如,如果您尝试在 IPython 提示符中打开图像,它也会失败。

In [2]: from PIL import Image
In [3]: Image.open("176678612.jpg")
---------------------------------------------------------------------------
UnidentifiedImageError                    Traceback (most recent call last)
<ipython-input-3-3f91b2f4e49a> in <module>
----> 1 Image.open("176678612.jpg")

/opt/conda/envs/swin/lib/python3.7/site-packages/PIL/Image.py in open(fp, mode, formats)
   3022         warnings.warn(message)
   3023     raise UnidentifiedImageError(
-> 3024         "cannot identify image file %r" % (filename if filename else fp)
   3025     )
   3026 

UnidentifiedImageError: cannot identify image file '176678612.jpg'

处理此检查的相关代码来自PIL.Image.open()

"""
exception PIL.UnidentifiedImageError: If the image cannot be opened and
       identified.
"""

raise UnidentifiedImageError(
        "cannot identify image file %r" % (filename if filename else fp)


因此,修复方法是删除图像,或将其替换为未损坏的版本。

【讨论】:

【参考方案3】:

您需要提供图片的可下载链接。对我有用的是点击下载图片并复制该 URL。

【讨论】:

以上是关于PIL.UnidentifiedImageError:无法识别图像文件的主要内容,如果未能解决你的问题,请参考以下文章