我认为这个问题与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,所以我没有文件对象,我正在使用工厂的原始数据或以前创建的(Zope)Image对象。
我听说PIL在超过一定大小时处理图像数据的方式不同,但我不知道如何调整代码。或者它与PIL的延迟加载有关吗?
答案 0 :(得分:116)
我在这里回复有点迟,但我遇到了类似的问题,我想分享我的解决方案。首先,这是一个非常典型的堆栈跟踪问题:
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 install pillow”)有帮助,但可能不适用于PIL的默认安装
答案 1 :(得分: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)
看起来很愚蠢 - 它会像奇迹一样起作用。如果您的图像缺少数据,则会以灰色填充(请检查图像的底部)。
注意:不鼓励在Python中使用camel case,并且仅在类名中使用。
答案 2 :(得分:6)
这是我所做的:
LOAD_TRUNCATED_IMAGES = False
行从/usr/lib/python3/dist-packages/PIL/ImageFile.py:40
修改为LOAD_TRUNCATED_IMAGES = True
。但是,编辑文件需要root访问权限。 我在运行可能使用PIL库的pytorch时遇到此错误。
仅在遇到此错误时才进行此修复,而无需直接使用PIL。
否则请
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
答案 3 :(得分:2)
这可能不是PIL问题。它可能与您的HTTP Server设置有关。 HTTP服务器限制了将被接受的实体主体的大小。
例如,在Apache FCGI中,选项FcgidMaxRequestLen确定可以上载的文件的最大大小。
检查您的服务器 - 它可能是限制上传大小的那个。
答案 4 :(得分:0)
我不得不将tds版本更改为7.2以防止这种情况发生。也适用于tds版本8.0,但我在8.0中遇到了一些其他问题。