Django,Soll缩略裁剪图片头

Django,Soll缩略裁剪图片头,django,sorl-thumbnail,Django,Sorl Thumbnail,伙计们,我想知道sorl缩略图是否有从下到上的裁剪选项。。。我有一个小问题,在一些图片中,sorl缩略图在图片中的人的头上交叉 谢谢我不相信solr的缩略图中已经内置了这个插件,但是这里有一个我从reddit中抄袭的插件,它可以完成你想要的东西。这并不完美,但它往往能完成工作。它不从下到上进行裁剪,而是使用切片的熵来确定从哪个端进行裁剪。这是对reddit版本的一个轻微改进,因为它可以处理纵向或横向图像 import Image, ImageFile, math #from ImageEnhan

伙计们,我想知道sorl缩略图是否有从下到上的裁剪选项。。。我有一个小问题,在一些图片中,sorl缩略图在图片中的人的头上交叉


谢谢

我不相信solr的缩略图中已经内置了这个插件,但是这里有一个我从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',) 
导入图像、图像文件、数学
#从图像增强导入颜色
#导入操作系统,系统
def图像_熵(im):
“”“来自Reddit:计算图像的熵”“”
hist=im.histogram()
历史大小=总和(历史)
hist=[浮动(h)/hist中h的hist\U大小]
return-sum([p*math.log(p,2)表示历史中的p,如果p!=0])
def方形图像(im、请求的大小、选项):
“”“来自Reddit:如果图像的高度大于宽度,请将其对齐。确定
基于熵块,要切断哪些块。
这个版本得到了改进,因为它使宽于高的图像成为正方形。
"""
如果选项中的“autosquare”:
x、 y=im尺寸
#如果图像的高度大于宽度:
如果y>x:
当y>x时:
#一次切片10px,直到正方形
切片高度=最小值(y-x,10)
底部=中间裁剪((0,y-切片高度,x,y))
顶部=中间裁剪((0,0,x,切片高度))
#移除熵最小的切片
如果图像熵(底部)<图像熵(顶部):
im=im.裁剪((0,0,x,y-切片高度))
其他:
im=im.裁剪((0,切片高度,x,y))
x、 y=im尺寸
#如果图像宽度大于其高度
其他:
当y
我刚刚发布了新版sorl缩略图(3.2.5),从边缘进行裁剪,并根据btol45的答案进行智能裁剪

引用文件:

默认情况下,图像在裁剪之前居中。收割 边,传递一个逗号分隔的字符串,该字符串包含
x
y
百分比偏移(负值从右侧/底部开始)。一些 例子如下:

  • crop=“0,0”
    将从左边缘和上边缘进行裁剪

  • crop=“-10,-0”
    将从右边缘(偏移10%)进行裁剪,然后 底边

  • crop=“,0”
    将保留x轴(水平方向)的默认行为 将图像居中)并从上边缘进行裁剪

还可以使用
crop=“smart”
对图像进行“智能裁剪”。形象 通过删除切片以增量方式裁剪到请求的大小 从熵最小的边开始


这个问题由来已久,但由于它是谷歌搜索django smart crop的第一个结果,所以我想添加我的小颗粒

这个“裁剪=自动”功能被添加到sorl中,但后来又被删除。因此,对于可能有此需求的其他人,您可以尝试:


它允许您通过管理员设置图像的关注中心。

当原始答案不再有效时,在sorl的最新版本中,您可以指定以空格分隔的x和y裁剪值。例如,crop=“center top”,将以X为中心,但将顶部保留在Y,这对我来说更适合拍摄人物照片,但并不完美。

只是一个注释:您可以在此处看到一个非solr版本:只是一个注释:它是sorl,而不是solr;)请注意,此答案适用于sorl缩略图的古老版本,不适用于任何较新版本。它适用于still;)我添加了一个在最近的sorl版本中有效的答案。简而言之,crop=“居中顶部”。