1. 简介
今天我们来学习如何使用 Python 对大图进行切片,并将切出来的小图组合成大图。这个技能在实际工作中应用广泛,比如在制作瓷砖拼图、长图合并等场景中都能用到。
在本文中,我们将使用 Python 中的 Pillow 库进行图像处理。
2. 安装 Pillow 库
在开始代码编写之前,我们需要先安装 Pillow 库。如果您还没有安装,可以通过以下命令在终端中进行安装:
pip install Pillow
3. 大图切片成小图
首先我们需要将大图切片成小图。这里我们设置切片大小是500×500像素(您可以根据实际情况进行修改),并将切片后的小图保存在指定的目录中。
3.1 打开大图并获取图片大小
在 Python 中,我们可以使用 Pillow 库中的 Image
模块来打开图片。接下来,我们需要获取大图的大小以确定切片的数量。
以下是获取图片大小的代码:
from PIL import Image
img_path = "path/to/image.jpg"
img = Image.open(img_path)
width, height = img.size
其中,img_path
指定了大图的路径,img = Image.open(img_path)
创建了一个 Image 对象,img.size
获取了图片的宽度和高度。
3.2 切片大图
接下来我们需要使用 Python 的循环来切片大图。我们使用两个循环,一个循环是沿着图片的宽度切片,另一个循环是沿着图片的高度切片。
切片后的小图保存在指定的目录中。
以下是切片代码:
import os
tile_size = 500
x_range = width // tile_size
y_range = height // tile_size
for x in range(x_range):
for y in range(y_range):
left = x * tile_size
upper = y * tile_size
right = left + tile_size
lower = upper + tile_size
tile = img.crop((left, upper, right, lower))
filepath = os.path.join("tiles", f"{x}_{y}.jpg")
tile.save(filepath)
其中,tile_size
指定了切片大小,x_range
和y_range
分别计算了切片的宽度和高度。
接着,我们使用两个循环,循环变量x
表示宽度切片,变量y
表示高度切片。我们通过计算出切片的左上角(left, upper)
和右下角(right, lower)
坐标来切片大图,并将切片保存在 "tiles"
目录中。
4. 小图组合成大图
我们已经将大图切成了许多小图,现在需要将这些小图组合成一张大图。在 Python 中,我们也能使用 Pillow 库中的 Image
模块来实现图片的组合。
4.1 创建一个空白大图
首先,我们需要根据小图的数量和大小计算出组合后的大图大小,然后创建一个空白的大图。我们可以使用 Image.new()
方法创建空白图片。
以下是创建一个空白大图的代码:
import math
merged_size = math.ceil(width/tile_size) * math.ceil(height/tile_size) * tile_size
merged_img = Image.new("RGB", (merged_size, merged_size), "#FFFFFF")
其中,merged_size
计算出了组合后的大图大小,然后我们使用 Image.new()
方法创建空白图片的对象 merged_img
。参数 "RGB"
表示图像模式为 RGB 颜色模式,大小为图片宽度和高度。最后一个参数 "#FFFFFF"
表示背景颜色,默认为黑色。
4.2 将小图组合成大图
接下来我们需要将切出来的小图组合成一张大图。这里我们使用和切片同样的方式进行循环。
以下是组合小图的代码:
for x in range(x_range):
for y in range(y_range):
filepath = os.path.join("tiles", f"{x}_{y}.jpg")
tile = Image.open(filepath)
x_pos = x * tile_size
y_pos = y * tile_size
merged_img.paste(tile, (x_pos, y_pos))
其中,filepath
是切出来的小图路径,Image.open(filepath)
打开小图,x_pos
和y_pos
分别计算了小图的左上角坐标,merged_img.paste(tile, (x_pos, y_pos))
将小图粘贴到大图中。
5. 示例代码
现在,我们将切片和组合的代码整合到一起,并且加上一些注释,生成示例代码:
from PIL import Image
import os
import math
# 打开图片并获取图片大小
img_path = "path/to/image.jpg"
img = Image.open(img_path)
width, height = img.size
# 切片大小
tile_size = 500
# 计算切片数量
x_range = math.ceil(width / tile_size)
y_range = math.ceil(height / tile_size)
# 循环切片
for x in range(x_range):
for y in range(y_range):
# 计算切片坐标
left = x * tile_size
upper = y * tile_size
right = left + tile_size
lower = upper + tile_size
# 切片并保存
tile = img.crop((left, upper, right, lower))
filepath = os.path.join("tiles", f"{x}_{y}.jpg")
tile.save(filepath)
# 计算组合后的图片大小
merged_size = x_range * tile_size, y_range * tile_size
merged_img = Image.new("RGB", merged_size, "#FFFFFF")
# 循环组合
for x in range(x_range):
for y in range(y_range):
# 计算切片坐标
filepath = os.path.join("tiles", f"{x}_{y}.jpg")
tile = Image.open(filepath)
x_pos = x * tile_size
y_pos = y * tile_size
merged_img.paste(tile, (x_pos, y_pos))
# 保存组合后的图片
merged_img.save("path/to/merged/image.jpg")
总结
在本文中,我们学习了如何使用 Python 中的 Pillow 库对大图进行切片,并将切出来的小图组合成一张大图。
这个技能在实际工作中有很多用途,比如制作瓷砖拼图、长图合并等场景中都能用到。同时,通过本文的学习,您还可以更深入地了解 Python 中 Pillow 库的使用。