Джанго, щавель-уменьшенная голова - PullRequest
3 голосов
/ 04 октября 2009

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

Спасибо

Ответы [ 4 ]

5 голосов
/ 05 октября 2009

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

Цитирование документов:

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

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

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

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

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

5 голосов
/ 04 октября 2009

Я не верю, что это встроено в 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',) 
3 голосов
/ 06 мая 2012

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

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

https://github.com/francescortiz/image

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

1 голос
/ 13 декабря 2012

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

...