Python 图像库错误 - 渲染时捕获 IOError:没有足够的数据

Posted

技术标签:

【中文标题】Python 图像库错误 - 渲染时捕获 IOError:没有足够的数据【英文标题】:Python Image Library Error - Caught IOError while rendering: not enough data 【发布时间】:2012-05-21 22:24:19 【问题描述】:

我创建了一个网站,它使用 sorl-thumbnail 来调整上传的图片大小。大多数图像都在调整大小时没有任何问题,但很少出现以下错误:

Caught IOError while rendering: not enough data
Request Method: GET
Request URL:    http://localhost:8000/user/nash22/photographs/
Django Version: 1.3.1
Exception Type: TemplateSyntaxError
Exception Value:    
Caught IOError while rendering: not enough data
Exception Location: /usr/local/lib/python2.7/site-packages/PIL/TiffImagePlugin.py in load, line 382
Python Executable:  /usr/local/bin/python
Python Version: 2.7.1

我在谷歌上搜索,但找不到任何相关答案。有人可以帮助我发生了什么,我该如何解决?谢谢。

编辑

完整的回溯

Traceback(最近一次调用最后一次):

文件 "/lib/python2.7/django/core/handlers/base.py", 第 111 行,在 get_response response = callback(request, *callback_args, **callback_kwargs)

文件 "/home/swaroop/project/apps/photography/views.py", 第 702 行,在 showPhoto context_instance=RequestContext(request))

文件 "/lib/python2.7/django/shortcuts/init.py", 第 20 行,在 render_to_response 返回 HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)

文件 "/lib/python2.7/django/template/loader.py", 第 188 行,在 render_to_string 返回 t.render(context_instance)

文件 "/lib/python2.7/django/template/base.py", 第 123 行,在渲染中返回 self._render(context)

文件 "/lib/python2.7/django/template/base.py", 第 117 行,在 _render 中返回 self.nodelist.render(context)

文件 "/lib/python2.7/django/template/base.py", 第 744 行,在渲染 bits.append(self.render_node(node, context)) 中

文件 "/lib/python2.7/django/template/base.py", 第 757 行,在 render_node 返回 node.render(context)

文件 "/lib/python2.7/django/template/loader_tags.py", 第 127 行,在渲染中返回compiled_pa​​rent._render(context)

文件 "/lib/python2.7/django/template/base.py", 第 117 行,在 _render 中返回 self.nodelist.render(context)

文件 "/lib/python2.7/django/template/base.py", 第 744 行,在渲染 bits.append(self.render_node(node, context)) 中

文件 "/lib/python2.7/django/template/base.py", 第 757 行,在 render_node 返回 node.render(context)

文件 "/lib/python2.7/django/template/loader_tags.py", 第 64 行,在渲染结果 = block.nodelist.render(context)

文件 "/lib/python2.7/django/template/base.py", 第 744 行,在渲染 bits.append(self.render_node(node, context)) 中

文件 "/lib/python2.7/django/template/base.py", 第 757 行,在 render_node 返回 node.render(context)

文件 "/lib/python2.7/sorl/thumbnail/templatetags/thumbnail.py", 第 45 行,在渲染中返回 self._render(context)

文件 "/lib/python2.7/sorl/thumbnail/templatetags/thumbnail.py", 第 97 行,渲染文件,几何,**选项

文件“/lib/python2.7/sorl/thumbnail/base.py”,第 61 行, 在 get_thumbnail 缩略图中)

文件“/lib/python2.7/sorl/thumbnail/base.py”,第 86 行, 在 _create_thumbnail image = default.engine.create(source_image, 几何,选项)

文件“/lib/python2.7/sorl/thumbnail/engines/base.py”, 第 15 行,在 create image = self.orientation(image, geometry, 选项)

文件“/lib/python2.7/sorl/thumbnail/engines/base.py”, 第 26 行,方向返回 self._orientation(image)

文件 "/lib/python2.7/sorl/thumbnail/engines/pil_engine.py", 第 29 行,在 _orientation exif = image._getexif()

文件“/usr/local/lib/python2.7/site-packages/PIL/JpegImagePlugin.py”, 第 381 行,在 _getexif info.load(file)

文件“/usr/local/lib/python2.7/site-packages/PIL/TiffImagePlugin.py”, 第 382 行,在加载引发 IOError,“数据不足”

IOError: 没有足够的数据

【问题讨论】:

【参考方案1】:

更新

image._getexif 声称是高度实验性的。参考sorl-thumbnail 和issue #98,您可以将代码更新为

def _orientation(self, image):
    try:
        exif = image._getexif()
    except (AttributeError, IOError):
        exif = None

这是由 PIL 尝试加载已损坏或可能不受支持的 TIFF 文件引起的。 通常当你使用forms.ImageField时,Django会检查上传图片的正确性。 因此,您需要:

确保您使用forms.ImageFieldmodels.ImageField 的默认值)来处理视图中的上传

检查上传的图片

from PIL import Image
Image.open(path).load()
使用处理 TIFF 的工具包打开图像,如果可以打开,将其保存为 Jpeg 或 Png 并更新模型实例的字段以指向新文件。

您还可以限制用户上传普通格式,例如 jpeg/png/gif 而不是 TIFF

【讨论】:

感谢您的快速回复。我检查了以下是我的观察结果:1)我正在使用 forms.ImageField 2)我尝试使用 load 加载创建问题的图像并得到以下结果: 所以我猜图像不是损坏。 3) 图像是 jpeg 图像而不是 TIFF 图像所以一切看起来都有效,现在我们回到原来的问题。我得到的错误还有其他可能的原因吗? @swaroop 嗯,你能发布 sorl-thumbnail 回溯吗? 我在我的原始帖子中附加了回溯。我可以在回溯中注意到 sorl-thumbnail 正在加载 TiffImagePlugin.py,这意味着它的检测图像是 tiff。但是传递给 sorl-thumbnail 的图像是 jpeg 而不是 TIFF 图像。所以现在很困惑 @swaroop PIL/JpegImagePlugin.py 中的代码 _getexif 依赖于 TiffImagePlugIn 处理包含 exif 信息的嵌入式 tiff,您可以在函数内看到 cmets。它还声称是高度实验性的... 仅供参考,问题 #98 有一个拉取请求,并已合并到开发分支中,可在 github.com/mariocesar/sorl-thumbnail

以上是关于Python 图像库错误 - 渲染时捕获 IOError:没有足够的数据的主要内容,如果未能解决你的问题,请参考以下文章

Python 图像库 - 文本渲染

如何在渲染 ejs 视图 Node.js 时捕获错误

在 Python 中将 openCV 图像转换为 PIL 图像(用于 Zbar 库)

如何在内容页面中添加按钮以使用自定义渲染器 - 视图捕获图像

将图像从库中上传到服务器

使用通用 PasswordChangeForm Django 视图渲染时捕获 NoReverseMatch