我一直在使用sorl-thumbnail一段时间没有问题。但是,出现以下错误:encoder error -2 when writing image file
。
以下代码会导致错误:
from sorl.thumbnail import get_thumbnail
photobooth_thumbnail = get_thumbnail(img_file,
PHOTOBOOTH_THUMB_SIZE, crop='center', quality=99)
成为img_file
Django模型的ImageField,当PHOTOBOOTH_THUMB_SIZE
“足够大”时。当我使用PHOTOBOOTH_THUMB_SIZE = '670'
时,一切正常,但当我将其增加到PHOTOBOOTH_THUMB_SIZE = '1280'
时,出现上述错误。
考虑到低级消息,我怀疑这是PIL中的错误,而不是sorl-thumbnail中的错误。我想要更大的缩略图,所以我很感激任何帮助。提前谢谢。
答案 0 :(得分:1)
我最终修补了pil_engine.py
中的文件/lib/python2.7/site-packages/sorl/thumbnail/engines
:
--- pil_engine.py 2013-09-09 03:58:27.000000000 +0000
+++ pil_engine_new.py 2013-11-05 21:19:15.053034383 +0000
@@ -79,6 +79,7 @@
image.save(buf, **params)
except IOError:
params.pop('optimize')
+ ImageFile.MAXBLOCK = image.size[0] * image.size[1]
image.save(buf, **params)
raw_data = buf.getvalue()
buf.close()
这解决了我的问题。
答案 1 :(得分:0)
在某些设置中,某些图像只会出现此错误。因此,如果你为image.save()更改至少一个参数,就像@Pablo Antonio所说的那样。我可能会工作。我做了以下事情:
def img_save(img):
quality = 80 # Default level we start from and decrease till 30
need_retry = True
while need_retry:
try:
img.save(self.dst_image_file, 'JPEG', quality=quality, optimize=True, progressive=True)
except IOError as err:
quality = quality - 1
if quality <= 20:
need_retry = False
else:
need_retry = False
答案 2 :(得分:0)
我根据图像的大小通过缩略图质量修改解决了这个问题。
def thumbnail_quality_calc(size, max_block=720*720):
q_ratio = size / max_block
# can also include the PHOTOBOOTH_THUMB_SIZE in the logic to calculate the q_ratio to improve the formula
return math.floor(100 - q_ratio)
from sorl.thumbnail import get_thumbnail
img_quality = thumbnail_quality_calc(size=img_file.size)
photobooth_thumbnail = get_thumbnail(img_file,PHOTOBOOTH_THUMB_SIZE, crop='center', quality=img_quality)
# example
# size = 1024*1024
# quality will be 97
# This will help you to prevent encoder error
如果图像尺寸太大而您想要它,则会导致错误 已裁剪但具有高质量的缩略图,可以增加 最大块大小,否则会降低质量。 上面的解决方案使用第二种方法,可以在不更改基本程序包代码的情况下为您提供帮助。