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_parent._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.ImageField
(models.ImageField
的默认值)来处理视图中的上传
检查上传的图片
from PIL import Image
Image.open(path).load()
使用处理 TIFF 的工具包打开图像,如果可以打开,将其保存为 Jpeg 或 Png 并更新模型实例的字段以指向新文件。
您还可以限制用户上传普通格式,例如 jpeg/png/gif 而不是 TIFF
【讨论】:
感谢您的快速回复。我检查了以下是我的观察结果:1)我正在使用 forms.ImageField 2)我尝试使用 load 加载创建问题的图像并得到以下结果:PIL/JpegImagePlugin.py
中的代码 _getexif
依赖于 TiffImagePlugIn
处理包含 exif 信息的嵌入式 tiff,您可以在函数内看到 cmets。它还声称是高度实验性的...
仅供参考,问题 #98 有一个拉取请求,并已合并到开发分支中,可在 github.com/mariocesar/sorl-thumbnail以上是关于Python 图像库错误 - 渲染时捕获 IOError:没有足够的数据的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中将 openCV 图像转换为 PIL 图像(用于 Zbar 库)