sorl-thumbnail: ошибка кодировщика -2 при записи файла изображения

Я использую 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 моделью ImageField Django и когда PHOTOBOOTH_THUMB_SIZE является «достаточно большим». Когда я использовал PHOTOBOOTH_THUMB_SIZE = '670', все работало просто отлично, но когда я увеличил его до PHOTOBOOTH_THUMB_SIZE = '1280', появилась вышеупомянутая ошибка.

Я подозреваю, что это ошибка в PIL, а не в sorl-thumbnail, учитывая сообщение низкого уровня. Я хотел бы иметь большие миниатюры, поэтому я был бы признателен за любую помощь в этом. Заранее спасибо.


person Pablo Antonio    schedule 25.10.2013    source источник


Ответы (3)


В итоге я пропатчил файл 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()

Это решило проблему для меня.

person Pablo Antonio    schedule 06.02.2014

Похоже, эта ошибка возникает только для некоторых изображений при определенных настройках. Итак, если вы измените хотя бы один параметр для 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
person Kostyantyn    schedule 07.12.2016

Я решил эту проблему с помощью изменения качества миниатюры в соответствии с размером изображения.

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

Ошибка возникает, если размер изображения слишком велик, и вы хотите, чтобы его миниатюра была обрезана, но с высоким качеством, либо вы увеличиваете размер блока MAX, либо уменьшаете качество. В приведенном выше решении используется второй метод, помогающий вам без изменения кода базового пакета.

person abhishek kasana    schedule 16.07.2019