Python PIL:如果照片区域不够,则使用黑色区域进行图像裁剪

时间:2011-12-16 06:08:38

标签: python python-imaging-library

我想做拇指并将其裁剪成所需尺寸。它工作正常,但如果我的新拇指区域小于裁剪1,则所有空白区域都填充黑色。 代码:

import os
from PIL import Image

def resize(file_path):
    file, ext = os.path.splitext(file_path)
    im = Image.open(file_path)
    size = (100, 'auto')
    new_path = file + "_.jpg"
    im.thumbnail(size, Image.ANTIALIAS)
    region = im.crop((0, 0, 100, 100))
    region.save(new_path, "JPEG")

也许有一些选项,比如max_height for crop method或其他什么?

谢谢! enter image description here

4 个答案:

答案 0 :(得分:2)

您需要在那里应用一些简单的算法,而不是盲目裁剪。

  • 在图像中获取最大尺寸的正方形,方形中心与图像中心对齐。 最大尺寸的正方形的边长等于图像的高度或宽度的最大值。

  • 获取正方形后,将其重新取样为缩略图尺寸的大小。

  • 这对于大多数图像应该可以正常工作,但是如果要为面部图像生成缩略图,这可能不是一个好方法,并且您可能需要一些面部识别技术来获得更好的输出。

答案 1 :(得分:1)

如果图像的最大值超过100x100,您是否只是有条件地裁剪图像? 如果是的话,

def resize(file_path):
    file, ext = os.path.splitext(file_path)
    im = Image.open(file_path)
    size = (100, 'auto')
    new_path = file + "_.jpg"
    im.thumbnail(size, Image.ANTIALIAS)
    if im.size[1] > 100:
        im = im.crop((0, 0, 100, 100))
    im.save(new_path, "JPEG")

答案 2 :(得分:1)

我会这样做:

  • 如果图像很宽,则将其缩放为100px高。如果它很高,则将其缩放为100px宽。

  • 裁剪中间的100x100。

    def resize(file_path):
        file, ext = os.path.splitext(file_path)
        im = Image.open(file_path)
        w, h = im.size
        size = (100, 'auto') if h > w else ('auto', 100)
        new_path = file + "_.jpg"
        im.thumbnail(size, Image.ANTIALIAS)
        w, h = im.size
        region = im.crop((w/2 - 50, h/2 - 50, w/2 + 50, h/2 + 50))
        region.save(new_path, "JPEG")
    

答案 3 :(得分:0)

我找到了解决方案:

import os
from PIL import Image

def resize(file_path):
    file, ext = os.path.splitext(file_path)
    im = Image.open(file_path)
    size = (100, 'auto')
    new_path = file + "_.jpg"
    im.thumbnail(size)
    (width, height) = im.size
    if height >= width: box = (0, 0, 100, 100)
    else: box = (0, 0, 100, height)
    region = im.crop(box)
    region.save(new_path, "JPEG")

感谢您的回复!