Sorl-thumbnail генерирует черные линии и нежелательные кадры

Я использую Sorl Thumbnail 12.4a1, Pillow 4.0.0 в проекте django.

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

Исходное изображение портретное jpg 765x1110

После запуска этого кода: get_thumbnail('/media/ryzsUIKZVUc.jpg', '464', upscale=False)

Я получаю изображение размером 464x320 с черным фоном слева и справа и обрезанным сверху и снизу.

это оригинал: https://www.dropbox.com/s/ia7906ec19xjhro/ryzsUIKZVUc.jpg?dl=0

и вот результат: https://www.dropbox.com/s/adgut5zkw4xln6e/62b2439654a00312defafddb862eda9b.jpg?dl=0

p.s. пытался загрузить сюда оригинал в виде изображения, но оно автоматически конвертировалось в портрет.. может это что-то значит?


person Vilial    schedule 14.03.2017    source источник


Ответы (2)


Рамка появляется из-за тега exif. Размер изображения определен неправильно.

Вы можете увидеть это, используя exiftool:

$ exiftool ryzsUIKZVUc.jpg 
ExifTool Version Number         : 10.10
File Name                       : ryzsUIKZVUc.jpg
Directory                       : .
File Size                       : 210 kB
File Modification Date/Time     : 2017:03:30 12:33:51+03:00
File Access Date/Time           : 2017:03:30 12:33:55+03:00
File Inode Change Date/Time     : 2017:03:30 12:33:51+03:00
File Permissions                : rw-rw-r--
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Comment                         : CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 99.
Exif Byte Order                 : Big-endian (Motorola, MM)
Processing Software             : Windows Photo Editor 10.0.10011.16384
Orientation                     : Rotate 270 CW
Software                        : Windows Photo Editor 10.0.10011.16384
Modify Date                     : 2017:03:07 09:28:15
Date/Time Original              : 2017:03:07 09:27:46
Create Date                     : 2017:03:07 09:27:46
Sub Sec Time Original           : 00
Sub Sec Time Digitized          : 00
Color Space                     : sRGB
Padding                         : (Binary data 2060 bytes, use -b option to extract)
Compression                     : JPEG (old-style)
X Resolution                    : 96
Y Resolution                    : 96
Resolution Unit                 : inches
Thumbnail Offset                : 4608
Thumbnail Length                : 8169
About                           : uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b
Creator Tool                    : Windows Photo Editor 10.0.10011.16384
Image Width                     : 1110
Image Height                    : 765
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 1110x765
Megapixels                      : 0.849
Create Date                     : 2017:03:07 09:27:46.00
Date/Time Original              : 2017:03:07 09:27:46.00
Thumbnail Image                 : (Binary data 8169 bytes, use -b option to extract)

Или используйте PIL

>>> from PIL import Image
>>> from PIL.ExifTags import TAGS
>>> 
>>> im = Image.open('ryzsUIKZVUc.jpg')
>>> exif = im._getexif()
>>> data = {}
>>> 
>>> for tag, value in exif.items():
...     decoded = TAGS.get(tag, tag)
...     data[decoded] = value
... 
>>> 
>>> data['Orientation']
8

Чтобы исправить это, вы можете перед созданием превью (повернуть изображение) сохранить картинку без этого тега.

Например,

def orient(image_path):
    """ Check are this img oriented """
    img = Image.open(image_path)
    # check is has exif data
    if not hasattr(img, '_getexif') or img._getexif() is None:
        return
    # if has information - try rotate img
    orientation = img._getexif().get(0x112)
    rotate_values = {3: 180, 6: 270, 8: 90}
    if orientation in rotate_values:
        img = img.rotate(rotate_values[orientation], expand=True)
    img.save(image_path, quality=100)

Или проще, измените настройки THUMBNAIL_ORIENTATION = False. В этом случае изображение просто перестает вращаться. И больше не создаются черные линии.

person Maks Skorokhod    schedule 30.03.2017

Этот баг уже исправлен в репозитории на гитхабе. Этот PR https://github.com/mariocesar/sorl-thumbnail/pull/233< /а>

Но в pypi все еще старый пакет. https://pypi.python.org/pypi/sorl-thumbnail/12.4a1 обновлено 17 ноября 2015 г.

Чтобы использовать новую версию, установите пакет прямо с github.

pip install -e git+https://github.com/mariocesar/sorl-thumbnail.git#egg=sorl-thumbnail

После установки вам нужно будет очистить кеш изображений

$ rm -rf path/to/media/cache/
$ python manage.py thumbnail clear
$ python manage.py thumbnail cleanup
person Maks Skorokhod    schedule 01.04.2017
comment
Пробовал эту версию, но получил тот же результат :( - person Vilial; 01.04.2017