pin_drop当前位置:知识文库 ❯ 图文

Pillow Image.crop()裁剪教程 - 图像裁剪方法详解

一、Image裁剪概述

Image.crop()方法用于从图像中裁剪出指定矩形区域。裁剪是图像处理中最常见的操作之一,通过指定左上角和右下角的坐标,可以精确地提取图像中的任意区域。

裁剪操作不会修改原始图像,而是返回一个新的Image对象。这一特性使得裁剪操作是安全的,不会影响原始数据。

二、crop()方法语法与参数

基本语法

代码示例

from PIL import Image

img = Image.open('example.jpg')
cropped = img.crop(box=None)

参数说明

参数 类型 必填 说明
box tuple 裁剪区域,格式为(left, upper, right, lower),默认为整个图像

返回值:返回一个新的Image对象,包含裁剪区域的内容。

三、坐标系说明

Pillow使用左上角为原点的坐标系,理解坐标系是正确使用crop()的关键:

  • left:裁剪区域左边界的x坐标

  • upper:裁剪区域上边界的y坐标

  • right:裁剪区域右边界的x坐标

  • lower:裁剪区域下边界的y坐标

提示:box参数的坐标顺序是(left, upper, right, lower),不是(x, y, width, height)。裁剪区域的宽度为 right - left,高度为 lower - upper。

四、代码示例演示

示例1:基本裁剪操作

代码示例

from PIL import Image

img = Image.new('RGB', (400, 300), color='white')
print(f"原始尺寸: {img.size}")

# 裁剪左上角100x100的区域
cropped = img.crop((0, 0, 100, 100))
print(f"裁剪后尺寸: {cropped.size}")

# 裁剪中心区域
left = 100
upper = 75
right = 300
lower = 225
center = img.crop((left, upper, right, lower))
print(f"中心区域尺寸: {center.size}")

输出:

代码示例

原始尺寸: (400, 300)
裁剪后尺寸: (100, 100)
中心区域尺寸: (200, 150)

示例2:裁剪图像的四个象限

代码示例

from PIL import Image

img = Image.new('RGB', (200, 200), color='blue')
w, h = img.size
half_w, half_h = w // 2, h // 2

# 四个象限
top_left = img.crop((0, 0, half_w, half_h))
top_right = img.crop((half_w, 0, w, half_h))
bottom_left = img.crop((0, half_h, half_w, h))
bottom_right = img.crop((half_w, half_h, w, h))

print(f"左上象限: {top_left.size}")
print(f"右上象限: {top_right.size}")
print(f"左下象限: {bottom_left.size}")
print(f"右下象限: {bottom_right.size}")

输出:

代码示例

左上象限: (100, 100)
右上象限: (100, 100)
左下象限: (100, 100)
右下象限: (100, 100)

示例3:裁剪并粘贴回原图

代码示例

from PIL import Image

img = Image.new('RGB', (200, 200), color='green')

# 裁剪左上角区域
region = img.crop((0, 0, 50, 50))

# 将裁剪区域粘贴到右下角
img.paste(region, (150, 150))
print(f"粘贴后图像尺寸: {img.size}")

# 使用超出边界的裁剪(会自动调整)
cropped = img.crop((-10, -10, 210, 210))
print(f"超出边界裁剪尺寸: {cropped.size}")

输出:

代码示例

粘贴后图像尺寸: (200, 200)
超出边界裁剪尺寸: (220, 220)

五、实际应用场景

  • 用户头像裁剪:让用户选择图片中的矩形区域作为头像,是社交平台的常见功能。

  • 证件照处理:按照标准尺寸裁剪出1寸或2寸照片,满足各类证件要求。

  • 图像拼接预处理:将大图裁剪为多个小块分别处理,常用于全景图拼接。

六、注意事项

  • 坐标顺序:crop()的box参数坐标顺序是(left, upper, right, lower),不是(x, y, width, height)。

  • 数据引用:crop()返回的是原图的视图,修改裁剪区域可能影响原图数据,建议先调用copy()

  • 边界处理:当box超出图像边界时,超出部分会用黑色填充(或透明,取决于模式)。

七、裁剪方式对比

方法 说明 适用场景
img.crop(box) 矩形区域裁剪 精确区域提取
img.resize() 缩放而非裁剪 改变图像尺寸
img.thumbnail() 原地缩放 生成缩略图
ImageOps.fit() 居中裁剪到指定尺寸 生成固定比例缩略图

八、小结与练习

通过本文的学习,我们掌握了Pillow中Image裁剪的核心方法:

  • 裁剪参数:crop()通过(left, upper, right, lower)四元组指定裁剪区域。

  • 安全操作:裁剪操作不修改原图,返回新的Image对象。

  • 边界处理:裁剪区域可以超出图像边界,超出部分自动填充。


练习题

练习1:编写程序,打开一张图片,裁剪出其中心正方形区域(取宽高的较小值作为边长)。

练习2:编写程序,将一张大图均匀裁剪为3x3的9张小图,分别保存为crop_0.jpg到crop_8.jpg。


常见问题

crop()的box参数坐标顺序是什么?

crop()的box参数格式为(left, upper, right, lower),即(左, 上, 右, 下)。注意这不是(x, y, width, height)格式。裁剪区域的宽度为 right - left,高度为 lower - upper。

裁剪区域超出图像边界会怎样?

当box坐标超出图像边界时,Pillow不会报错,超出部分会用黑色填充(对于RGB模式)或透明填充(对于RGBA模式)。裁剪后的图像尺寸会按照box参数计算的实际大小返回。

裁剪后修改结果会影响原图吗?

crop()返回的新Image对象可能与原图共享像素数据。如果修改裁剪后的图像,可能会影响原图数据。建议在裁剪后调用copy()方法创建独立副本,以确保修改不会影响原图。

如何实现圆形裁剪?

Pillow的crop()只支持矩形裁剪。要实现圆形裁剪,可以先crop()出包含圆形的矩形区域,然后使用ImageDraw绘制圆形蒙版,通过paste()或composite()方法将蒙版应用到裁剪结果上。

标签: Pillow Image裁剪 crop方法 图像处理 Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Pillow Image.open()与save()教程 - 图像打开保存详解 下一篇: Pillow图像缩放详解 - resize与thumbnail方法对比

poll相关推荐