sorl-thumbnail:编写图像文件时编码器错误-2

时间:2013-10-25 22:03:12

标签: django python-imaging-library sorl-thumbnail

我一直在使用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中的错误。我想要更大的缩略图,所以我很感激任何帮助。提前谢谢。

3 个答案:

答案 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

如果图像尺寸太大而您想要它,则会导致错误 已裁剪但具有高质量的缩略图,可以增加 最大块大小,否则会降低质量。 上面的解决方案使用第二种方法,可以在不更改基本程序包代码的情况下为您提供帮助。