Python PIL: 图片裁剪时若区域不足则填充黑色

2 投票
4 回答
4898 浏览
提问于 2025-04-17 08:29

我想制作一个缩略图,并把它裁剪到需要的大小。这个过程运行得很好,但如果我新的缩略图区域比裁剪的区域小,所有空白的地方就会填充成黑色。

代码:

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 的选项或者其他什么设置?

谢谢!

在这里输入图片描述

4 个回答

1

我会这样做:

  • 如果图片比较宽,就把它的高度调整到100像素。如果图片比较高,就把它的宽度调整到100像素。

  • 然后从中间裁剪出一个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")
    
2

你需要在这里使用一些简单的算法,而不是盲目裁剪图片。

  • 首先,找出图片中可以裁剪出的最大正方形,这个正方形的中心要和图片的中心对齐。最大正方形的边长应该是图片高度和宽度中较大的那个。

  • 得到这个正方形后,将它调整到你需要的缩略图尺寸。

  • 这种方法对于大多数图片来说都能很好地工作,不过如果你是在处理人脸图片的缩略图,这种方法可能就不太合适了,你可能需要一些人脸识别的技术来获得更好的效果。

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")

撰写回答