繁体   English   中英

PIL“IOError:图像文件被截断”与大图像

[英]PIL "IOError: image file truncated" with big images

我认为这个问题与 Zope 无关。 尽管如此,我会解释我正在尝试做的事情:

我在 Zope 中使用 PUT_factory 根据 FTP 将图像上传到 ZODB。 上传的图像在新创建的容器 object 中保存为 Zope 图像。 这很好用,但是如果图像超过一定大小(宽度和高度),我想调整它的大小。 所以我使用 PIL 的缩略图 function 将它们调整为 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,我没有文件 object,我使用的是来自工厂的原始数据或之前创建的(Zope)图像 object。

我听说当超过一定大小时 PIL 会以不同的方式处理图像数据,但我不知道如何调整我的代码。 还是和PIL的延迟加载有关?

我认为这个问题与 Zope 无关。 尽管如此,我将解释我正在尝试做的事情:

我在 Zope 中使用 PUT_factory 将图像上传到每个 FTP 的 ZODB。 上传的图像在新创建的容器对象中保存为 Zope 图像。 这工作正常,但如果图像超过特定尺寸(宽度和高度),我想调整它的大小。 所以我使用 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的懒加载有关?

我认为这个问题与 Zope 无关。 尽管如此,我将解释我正在尝试做的事情:

我在 Zope 中使用 PUT_factory 将图像上传到每个 FTP 的 ZODB。 上传的图像在新创建的容器对象中保存为 Zope 图像。 这工作正常,但如果图像超过特定尺寸(宽度和高度),我想调整它的大小。 所以我使用 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的懒加载有关?

我认为这个问题与 Zope 无关。 尽管如此,我将解释我正在尝试做的事情:

我在 Zope 中使用 PUT_factory 将图像上传到每个 FTP 的 ZODB。 上传的图像在新创建的容器对象中保存为 Zope 图像。 这工作正常,但如果图像超过特定尺寸(宽度和高度),我想调整它的大小。 所以我使用 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的懒加载有关?

我认为这个问题与 Zope 无关。 尽管如此,我将解释我正在尝试做的事情:

我在 Zope 中使用 PUT_factory 将图像上传到每个 FTP 的 ZODB。 上传的图像在新创建的容器对象中保存为 Zope 图像。 这工作正常,但如果图像超过特定尺寸(宽度和高度),我想调整它的大小。 所以我使用 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的懒加载有关?

我被同样的问题困住了。 但是,设置ImageFile.LOAD_TRUNCATED_IMAGES = True不适合我的情况,我已经检查过我的所有图像文件是否完整,但很大。

我使用cv2读取图像,然后将其转换为PIL.Image以解决问题。

img = cv2.imread(imgfile, cv2.IMREAD_GRAYSCALE)
img = Image.fromarray(img)

我认为这个问题与 Zope 无关。 尽管如此,我将解释我正在尝试做的事情:

我在 Zope 中使用 PUT_factory 将图像上传到每个 FTP 的 ZODB。 上传的图像在新创建的容器对象中保存为 Zope 图像。 这工作正常,但如果图像超过特定尺寸(宽度和高度),我想调整它的大小。 所以我使用 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的懒加载有关?

当图像部分损坏时,会导致 OSError。

我使用下面的代码检查并保存错误的图像列表。

try:
    img = Image.open(file_path)
    img.load()

    ## do the work with the loaded image

except OSError as error:
    print(f"{error} ({file_path})")
    
    with open("./error_file_list.txt", "a") as error_log:
        log.write(str(file_path))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM