Python使用Pillow库实现图片等分裁剪功能详解
日常做自动化、验证码识别、图像处理的时候,经常会有图片切割的需求:比如把一张拼接图切成左右两半、把长图横向等分、或者按固定坐标裁剪局部区域。Python 中最方便的方案就是 Pillow(PIL)库,几行代码就能搞定图片裁剪。
前置依赖:
pip install pillow
一、核心原理:Image.crop()
Pillow 的 crop(box) 是裁剪图片的核心方法。box 是一个四元组:(left, upper, right, lower)
- left:裁剪区域距离图片左侧的 x 坐标
- upper:裁剪区域距离图片顶部的 y 坐标
- right:裁剪区域右边界 x 坐标
- lower:裁剪区域下边界 y 坐标
重点:Pillow 的图片坐标系,原点 (0,0) 在图片左上角,x 向右增加,y 向下增加。
二、场景1:图片左右对半平分(你当前用到的场景)
需求:一张图从垂直中线切开,分成左右两张等宽图片。
逻辑:获取原图宽高,宽度除以2得到中线位置,分别裁剪左半部分、右半部分。
from PIL import Image
def split_img_left_right(img: Image.Image):
w, h = img.size
mid_x = w // 2
# 左半图:x从0到中线
left_part = img.crop((0, 0, mid_x, h))
# 右半图:x从中线到原图宽度
right_part = img.crop((mid_x, 0, w, h))
return left_part, right_part
if __name__ == "__main__":
img = Image.open("test.png")
left, right = split_img_left_right(img)
left.save("left.png")
right.save("right.png")
注意细节:
如果原图宽度是奇数,w // 2 整数除法会让左边比右边多1个像素。
例:宽度 101,mid_x = 50,左图宽51,右图宽50。
如果业务要求右边多1像素,改成 mid_x = (w + 1) // 2 即可。
三、场景2:纵向等分切割(切成上下多张)
比如一张长图,均匀切成上下 N 块,思路和左右切割一致,只是对高度做等分:
from PIL import Image
def split_img_top_bottom(img: Image.Image, n: int):
w, h = img.size
block_h = h // n
parts = []
for i in range(n):
y1 = i * block_h
y2 = y1 + block_h
part = img.crop((0, y1, w, y2))
parts.append(part)
return parts
四、场景3:按固定坐标自定义裁剪
很多时候不需要等分,只需要抠图片里指定一块区域,直接填坐标:
from PIL import Image
img = Image.open("test.png")
# 裁剪:x1=10, y1=20, x2=200, y2=100
crop_img = img.crop((10, 20, 200, 100))
crop_img.save("crop_result.png")
五、结合你之前的 resize 需求:切割后统一缩放
你之前用到 resize((355, 48), Image.LANCZOS),可以直接组合:切割完成之后,对两张子图做高质量缩放。
from PIL import Image
def split_and_resize(img: Image.Image, target_size=(355, 48)):
w, h = img.size
mid_x = w // 2
left_part = img.crop((0, 0, mid_x, h))
right_part = img.crop((mid_x, 0, w, h))
# LANCZOS 适合缩小图片,画质更好
left_part = left_part.resize(target_size, Image.LANCZOS)
right_part = right_part.resize(target_size, Image.LANCZOS)
return left_part, right_part
六、常见坑总结
resize((w,h))参数顺序是 (宽,高),和 crop 不要搞混;Image.LANCZOS插值算法:缩小图片效果优秀,放大图片不推荐;- crop 传入的坐标超出原图范围会报错,使用前最好做坐标校验;
- 透明图 RGBA 模式裁剪后会保留透明通道,保存 jpg 会报错,需要提前转 RGB:
img = img.convert("RGB"); - 打开图片时注意路径中文问题,Windows 环境下 Pillow 老版本对中文路径兼容性较差。
七、拓展
如果想要更复杂的网格切割(m行n列,切成网格小图),只需要双层循环,按宽高步长遍历裁剪即可。
切割图片是验证码识别、图像数据集预处理非常高频的操作,搭配 Pillow 的缩放、灰度、二值化,就能完成一套简单的图像预处理流水线。
到此这篇关于Python使用Pillow库实现图片等分裁剪功能详解的文章就介绍到这了,更多相关Python Pillow切割图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


最新评论