用Python实现自动拼接图片

事情的起因是我手上有240张裁剪好的图片,每张图片大小相同,想按文件名顺序把每4张图片拼在一起,排列顺序依次是左上、右上、左下、右下,并且将拼接好的图片分别命名。这要手动做起来实在是累死人,Photoshop中的动作也不能实现这个需求。结果上网一查,发现Python的PIL模块可以很容易地实现这一点,写了几段代码一运行,哎呀真是好用。感觉拼接图片这个小技巧还挺常用,在这里记录一下代码备查。

因为只有4张图片,所以排列图片的代码写得偷懒了,如果图片多的话,可以用除以2的倍数和余数做loop。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 有若干图片,每张图片大小相同。要求每四张图片拼接成一张图片,拼接顺序为:
# 1 2
# 3 4

import os
from PIL import Image # pip3 install pillow

unitW = 800 # 单张原始图片宽度
unitH = 800 # 单张原始图片高度
unitPath = "./原始图/" # 原始图片路径
targetPath = "./拼接后/" # 拼接图片保存路径
targetNamePath = "文件名列表.txt" # 拼接图片名列表文件,一个名字一行

unitName = [] # 存储原始图片名称
targetName = [] # 存储targetNamePath里拼接图片名称,数量需与(unitName)//4相同

for root, dirs, files in os.walk(unitPath):
for f in files :
unitName.append(f)
print("共导入", len(unitName), "张图片。")
with open(targetNamePath,'r', encoding='UTF-8') as text:
for line in text:
targetName.append(line.strip('\n'))
print("开始拼接图片……")
for i in range(len(unitName)//4): # 4张图片为一组
unitFile = [] # 存储图片文件
for j in range(4):
unitFile.append(Image.open(unitPath + unitName[i*4+j]))
target = Image.new('RGB', (2 * unitW, 2 * unitH))
for k in range(len(unitFile)):
if k == 0:
target.paste(unitFile[k], (0,0))
elif k == 1:
target.paste(unitFile[k], (unitW,0))
elif k == 2:
target.paste(unitFile[k], (0,unitH))
else:
target.paste(unitFile[k], (unitW,unitH))
target.save(targetPath+str(i+1).zfill(2)+'.'+targetName[i]+'.png', quality = 100)
unitFile = [] # 重置list
print("图片拼接完成。")