Python合并拼接图片
使用前需要安装PIL库,以下代码使用的Pillow(10.1.0)
pip install pillow
图片二维合并拼接(类似九宫格)
from PIL import Image
def img_merge1(img_list, output_file, x, y, isresize=True):
"""
合并图片列表中的图片,生成一个横向x个纵向y个的新图片,并指定保存名称
:param list img_list: 待合并的图片名称列表,文件名含路径
:param str output_file: 输出合并后的新图片,文件名含路径
:param int x: 合并后的新图片横向图片数
:param int y: 合并后的新图片纵向图片数
:param bool isresize: 是否统一每张图片的大小,默认True
"""
imgs = []; max_w, max_h = 0, 0 # 图片列表;图片最大宽,高
for f in img_list:
img = Image.open(f); imgs.append(img) # 打开图片,并存入列表
w, h = img.size # 图片尺寸宽*高,元组
max_w = w if max_w < w else max_w
max_h = h if max_h < h else max_h
new_img = Image.new('RGB', (max_w * x, max_h * y), 'white')
k = 0
for i in range(y): # 将所有的图片拼接到新的图片上,resize每张图片统一宽高
for j in range(x): # 按行写入,横向
if isresize: # 统一图片尺寸
img_k = imgs[k].resize((max_w, max_h))
else:
img_k = imgs[k]
new_img.paste(img_k, (j * max_w, i * max_h))
k = k + 1
new_img.save(output_file)
图片纵向合并拼接
from PIL import Image
def img_merge2(img_list, output_file, isresize=True):
"""
纵向合并图片列表中的图片,并指定保存名称
:param list img_list: 待合并的图片名称列表,文件名含路径
:param str output_file: 输出合并后的新图片,文件名含路径
:param bool isresize: 是否统一每张图片的大小,默认True
"""
imgs = []; max_w, max_h = 0, 0 # 图片列表;图片最大宽,高
total_h = 0
for f in img_list:
img = Image.open(f); imgs.append(img) # 打开图片,并存入列表
w, h = img.size # 图片尺寸宽*高,元组
max_w = w if max_w < w else max_w
max_h = h if max_h < h else max_h
total_h = total_h + h
if isresize: # 统一图片尺寸
new_img = Image.new('RGB', (max_w, max_h * len(imgs)), 'white')
for i in range(len(imgs)):
new_img.paste(imgs[i].resize((max_w, max_h)), (0, i * max_h))
else:
new_img = Image.new('RGB', (max_w, total_h), 'white')
h = 0
for i in range(len(imgs)):
new_img.paste(imgs[i], (0, h))
h = h + imgs[i].size[1] # 高度递增
new_img.save(output_file)
举例
from glob import glob
from natsort import natsorted
def main():
filepath = r'E:\测试\jpg\一眼丁真' # 待合并图片所在文件夹
n = 9 # 每组需要合并的图片数量
img_file = []; c = 0
for x in [r'\*.jpg', r'\*.png']: # 获取所有格式的图片,名称写入列表
img_file.extend(glob(filepath + x))
img_file = natsorted(img_file) # 自然排序,避免格式不同导致顺序不同
for i in range(0, len(img_file), n):
img_list = img_file[i : i+n]; c = c + 1
file_name = filepath + r'\合并图片{:04d}.jpg'.format(c)
img_merge1(img_list, file_name, 3, 3) # 调用函数合并图片
print('图片合并成功:{}'.format(file_name))
if __name__ == '__main__':
main()
18张图片合并为2张九宫格图片
统一原始图片尺寸,举例中调用函数合并图片
行代码
img_merge1(img_list, file_name, 3, 3)
合并前(内含17张jpg图片和1张png图片)
合并后
如果不需要统一原始图片尺寸
img_merge1(img_list, file_name, 3, 3, False)
合并后,可以清楚的看到图片有留白的区域
18张图片合并为2张纵向图片
统一原始图片尺寸,举例中调用函数合并图片
行代码
img_merge2(img_list, file_name)
合并后
同样,如果不需要统一原始图片尺寸
img_merge2(img_list, file_name, False)
合并结果小图看不清,就不展示了,和上面的一样,图片有留白的区域