Django, голова для обрезки sorl-миниатюр

ребята, я хотел бы знать, есть ли у sorl-thumbnail возможность обрезать снизу вверх... у меня проблема с мусором, на некоторых изображениях sorl-thumbnail обрезает головы людей на картинках.

Спасибо


person Asinox    schedule 04.10.2009    source источник


Ответы (4)


Я только что выпустил новую версию sorl-thumbnail (3.2.5) с обрезкой по краям и интеллектуальной обрезкой, вдохновленной ответом btol45.

Цитирую документы:

По умолчанию изображение центрируется перед кадрированием. Чтобы обрезать по краям, передайте разделенную запятыми строку, содержащую процентные смещения x и y (отрицательные значения идут справа/снизу). Вот несколько примеров:

  • crop="0,0" будет обрезать левый и верхний края.

  • crop="-10,-0" будет обрезать правый край (со смещением 10%) и нижний край.

  • crop=",0" сохранит поведение по умолчанию для оси x (горизонтальное центрирование изображения) и обрежет от верхнего края.

Изображение также может быть «умно обрезано» с помощью crop="smart". Изображение постепенно обрезается до требуемого размера путем удаления срезов с краев с наименьшей энтропией.

person SmileyChris    schedule 04.10.2009
comment
Обратите внимание, что этот ответ предназначен для древней версии sorl-thumbnail и не будет работать ни с одной из более поздних версий. - person Brandon Rhodes; 18.02.2012
comment
Он по-прежнему будет работать для easy-thumbnails ;) - person SmileyChris; 22.02.2012
comment
Я добавил ответ, который работает в последних версиях sorl. Короче говоря, обрезка = центр сверху. - person mrooney; 13.12.2012

Я не верю, что это уже встроено в solr-thumbnails, но вот плагин, который я взял с Reddit, который выполняет то, что вам нужно. Это не идеально, но, как правило, выполняет свою работу. Он не обрезает снизу вверх, а использует энтропию срезов, чтобы определить, с какого конца обрезать. Это небольшое улучшение по сравнению с версией Reddit, поскольку она обрабатывает как портретные, так и альбомные изображения.

import Image, ImageFile, math
#from ImageEnhance import Color
#import os, sys


def image_entropy(im):
    """From Reddit: Calculate the entropy of an image"""
    hist = im.histogram()
    hist_size = sum(hist)
    hist = [float(h) / hist_size for h in hist]
    return -sum([p * math.log(p, 2) for p in hist if p != 0])

def square_image(im, requested_size, opts):
    """From Reddit: if the image is taller than it is wide, square it off. determine
    which pieces to cut off based on the entropy pieces.

    This version is improved as it squares images that are wider than it is tall.
    """
    if 'autosquare' in opts:
        x,y = im.size

        # if the image is taller than it is wide:
        if y > x:
            while y > x:
                #slice 10px at a time until square
                slice_height = min(y - x, 10)

                bottom = im.crop((0, y - slice_height, x, y))
                top = im.crop((0, 0, x, slice_height))

                #remove the slice with the least entropy
                if image_entropy(bottom) < image_entropy(top):
                    im = im.crop((0, 0, x, y - slice_height))
                else:
                    im = im.crop((0, slice_height, x, y))

                x,y = im.size

        # If the image is wider than it is tall
        else:
            while y < x:
                #slice 10px at a time until square
                slice_width = min(x - y, 10)

                left = im.crop((0,0, y, slice_width))
                right = im.crop((0,y - slice_width, x, y))

                #remove the slice with the least entropy
                if image_entropy(left) < image_entropy(right):
                    im = im.crop((0, 0, x - slice_width, y))
                else:
                    im = im.crop((slice_width, 0, x, y))

                x,y = im.size

        im = im.resize(requested_size, resample=Image.ANTIALIAS)

    return im
square_image.valid_options = ('autosquare',) 
person Brian Tol    schedule 04.10.2009
comment
Просто примечание: вы можете увидеть версию без solr здесь: github.com/wiremine/ Python-Square-Thumbnail-Creator - person Brian Tol; 04.10.2009
comment
Просто примечание: это сорл, а не солр;) - person SmileyChris; 04.10.2009

Этот вопрос старый, но, поскольку он появляется как первый результат в Google при поиске смарт-культуры django, я хочу добавить свое маленькое зерно.

Эта функция «crop = auto» была добавлена ​​​​в sorl, но позже ее снова удалили. Итак, для других, у которых может возникнуть эта потребность, вы можете попробовать:

https://github.com/francescortiz/image

который позволяет установить центр внимания изображения через админку.

person francescortiz    schedule 06.05.2012

Хотя исходный ответ больше не работает, в последних версиях sorl вы можете указать значения обрезки x и y, разделенные пробелами. Например, «crop="center top" будет центрироваться по оси X, но сохранять верхнюю часть по оси Y, что в моем случае было лучше для изображений людей, но не идеально.

person mrooney    schedule 13.12.2012