ребята, я хотел бы знать, есть ли у sorl-thumbnail возможность обрезать снизу вверх... у меня проблема с мусором, на некоторых изображениях sorl-thumbnail обрезает головы людей на картинках.
Спасибо
ребята, я хотел бы знать, есть ли у sorl-thumbnail возможность обрезать снизу вверх... у меня проблема с мусором, на некоторых изображениях sorl-thumbnail обрезает головы людей на картинках.
Спасибо
Я только что выпустил новую версию sorl-thumbnail (3.2.5) с обрезкой по краям и интеллектуальной обрезкой, вдохновленной ответом btol45.
Цитирую документы:
По умолчанию изображение центрируется перед кадрированием. Чтобы обрезать по краям, передайте разделенную запятыми строку, содержащую процентные смещения
x
иy
(отрицательные значения идут справа/снизу). Вот несколько примеров:
crop="0,0"
будет обрезать левый и верхний края.
crop="-10,-0"
будет обрезать правый край (со смещением 10%) и нижний край.
crop=",0"
сохранит поведение по умолчанию для оси x (горизонтальное центрирование изображения) и обрежет от верхнего края.Изображение также может быть «умно обрезано» с помощью
crop="smart"
. Изображение постепенно обрезается до требуемого размера путем удаления срезов с краев с наименьшей энтропией.
Я не верю, что это уже встроено в 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',)
Этот вопрос старый, но, поскольку он появляется как первый результат в Google при поиске смарт-культуры django, я хочу добавить свое маленькое зерно.
Эта функция «crop = auto» была добавлена в sorl, но позже ее снова удалили. Итак, для других, у которых может возникнуть эта потребность, вы можете попробовать:
https://github.com/francescortiz/image
который позволяет установить центр внимания изображения через админку.
Хотя исходный ответ больше не работает, в последних версиях sorl вы можете указать значения обрезки x и y, разделенные пробелами. Например, «crop="center top" будет центрироваться по оси X, но сохранять верхнюю часть по оси Y, что в моем случае было лучше для изображений людей, но не идеально.