我认为这个问题与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).
我从我的相机测试了很多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)
因为我使用的是put_Factory,所以没有file对象,我使用的是工厂中的原始数据或以前创建的(Zope)Image对象。
我听说当超过某个大小时,PIL会以不同的方式处理图像数据,但我不知道如何调整我的代码。还是和PIL的懒加载有关?
我在这里回复有点晚,但我遇到了类似的问题,我想分享我的解决方案。首先,下面是针对此问题的非常典型的堆栈跟踪:
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)
如果我们看一下第220行(在您的例子中是第201行-可能您运行的版本略有不同),我们会看到PIL正在读取文件的块,并且它预计这些块将具有一定的大小。原来,您可以通过更改设置来要求pil容忍被截断的文件(挡路中缺少某些文件)。
在您的挡路代码之前,只需添加以下内容:
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
.而且你应该表现得很好。
编辑:看起来这对与Pillow捆绑在一起的PIL版本("pip安装枕头")有帮助,但可能不适用于PIL的默认安装
这篇关于PIL&QOOT;IOERROR:带有大图像的图像文件被截断(&Q)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!