Python PIL"IOError:图像文件被截断",带有大图像

Ras*_*taf 54 python zope image python-imaging-library

我认为这个问题与Zope无关.尽管如此,我还是要解释一下我要做的事情:

我在Zope中使用PUT_factory将图像上传到每个FTP的ZODB.上传的图像将作为Zope Image保存在新创建的容器对象中.这工作正常,但我想调整图像大小,如果它超过一定的大小(宽度和高度).所以我使用PIL的缩略图功能来调整它们的大小,即200x200.只要上传的图像相对较小,这就可以正常工作.我没有查看确切的限制,但976x1296px仍然可以.

随着更大的图片,我得到:

Module PIL.Image, line 1559, in thumbnail
Module PIL.ImageFile, line 201, in load
IOError: image file is truncated (nn bytes not processed).
Run Code Online (Sandbox Code Playgroud)

我从相机测试了很多jpeg.我不认为它们都被截断了.

这是我的代码:

if img and img.meta_type == 'Image':
  pilImg = PIL.Image.open( StringIO(str(img.data)) )
elif imgData:
  pilImg = PIL.Image.open( StringIO(imgData) )

pilImg.thumbnail((width, height), PIL.Image.ANTIALIAS)
Run Code Online (Sandbox Code Playgroud)

因为我正在使用PUT_factory,所以我没有文件对象,我使用的是工厂的原始数据或以前创建的(Zope)Image对象.

我听说PIL在超过一定大小时处理图像数据的方式不同,但我不知道如何调整代码.或者它与PIL的延迟加载有关?

abh*_*man 141

我在这里回复有点迟,但我遇到了类似的问题,我想分享我的解决方案.首先,这是一个非常典型的堆栈跟踪问题:

Traceback (most recent call last):
  ...
  File ..., line 2064, in ...
    im.thumbnail(DEFAULT_THUMBNAIL_SIZE, Image.ANTIALIAS)
  File "/Library/Python/2.7/site-packages/PIL/Image.py", line 1572, in thumbnail
    self.load()
  File "/Library/Python/2.7/site-packages/PIL/ImageFile.py", line 220, in load
    raise IOError("image file is truncated (%d bytes not processed)" % len(b))
IOError: image file is truncated (57 bytes not processed)
Run Code Online (Sandbox Code Playgroud)

如果我们查看第220行(在您的情况下第201行 - 也许您运行的版本稍有不同),我们会看到PIL正在读取文件的块,并且它希望块将具有一定的大小.事实证明,您可以通过更改设置来要求PIL容忍被截断的文件(从块中丢失一些文件).

在代码块之前的某个地方,只需添加以下内容:

from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
Run Code Online (Sandbox Code Playgroud)

......你应该好.

编辑:看起来这有助于Pillow捆绑的PIL版本("pip安装枕头"),但可能不适用于PIL的默认安装

  • 只是出于好奇,这会影响解析的图像吗?PIL会对截断的图像保持沉默,但是图像会好吗?我想解决我的问题,但我不想得到损坏的图像. (7认同)
  • 帕维尔(Pawel),图片将以灰色全尺寸显示。 (3认同)
  • 这可以工作,但它会在我的图像底部留下难看的白色条.如何动态裁剪此白条? (3认同)
  • 我有点震惊,仍然需要这个旧的解决方案,并且在 PIL/Pillow 中默认不考虑。不管怎样,谢谢!许多人对此表示赞赏(我实际上不得不使用 `imageio` 来获得导致这篇文章的类似错误,因为 Pillow 只是简单地报告了 `JpegImageFile` 和 `float` 之间的无效操作)。 (2认同)

Ctr*_*l-C 12

最棒的是你可以:

if img and img.meta_type == 'Image':
    pilImg = PIL.Image.open( StringIO(str(img.data)) )
elif imgData:
    pilImg = PIL.Image.open( StringIO(imgData) )

try:
    pilImg.load()
except IOError:
    pass # You can always log it to logger

pilImg.thumbnail((width, height), PIL.Image.ANTIALIAS)
Run Code Online (Sandbox Code Playgroud)

虽然看起来很蠢 - 它会像奇迹一样运作.如果您的图像缺少数据,则会以灰色填充(请检查图像的底部).

注意:不鼓励在Python中使用camel case,仅在类名中使用.


Akh*_*hil 8

这是我所做的:

  • 编辑LOAD_TRUNCATED_IMAGES = False行从/usr/lib/python3/dist-packages/PIL/ImageFile.py:40LOAD_TRUNCATED_IMAGES = True

不过,编辑文件需要 root 访问权限。我在运行一些可能使用 PIL 库的 pytorch 时遇到了这个错误。

仅在遇到此错误时才进行此修复,而不直接使用 PIL。

其他请做

from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
Run Code Online (Sandbox Code Playgroud)


fer*_*oze 6

这可能不是 PIL 问题。这可能与您的 HTTP 服务器设置有关。HTTP 服务器对接受的实体主体的大小设置了限制。

例如,在 Apache FCGI 中,选项 FcgidMaxRequestLen 确定可以上传的文件的最大大小。

检查您的服务器 - 它可能是限制上传大小的服务器。