前段时间需要合并一些图片,左右上下合并的都有,所以写了一个工具类。不是很完善,贴在这里备忘。
import math
import os
from PIL import Image
# 获取某个目录的文件并按文件名排序
def get_image_list(folder):
imgs = list()
fs = os.listdir(folder)
for f in fs:
imgs.append(f)
if len(imgs) != 0:
imgs = imgs.sort() # 把文件按文件名排序
res = [] # 返回的文件名数组
for img in imgs:
res.append(os.path.join(folder, img)) # 拼接完整地址返回
return res
# 图片拼接 pt = 1横向 2竖向
def merge_images(images, optimize=False,fname=1,pt=1):
with Image.open(images[0]) as im:
width, height = im.size
if pt == 1:
final = Image.new("RGBA", (width * len(images), height))
i = 0
for img in images:
with Image.open(img) as im:
print('merge {} ...'.format(img))
final.paste(im, (i * width, 0))
i += 1
print(f'saving {fname}.png ...')
final.save(f'{fname}.png', 'PNG', optimize=optimize)
else:
final = Image.new("RGBA", (width, height * len(images)))
i = 0
for img in images:
with Image.open(img) as im:
print('merge {} ...'.format(img))
final.paste(im, (0, i * height))
i += 1
print(f'saving {fname}.png ...')
final.save(f'{fname}.png', 'PNG', optimize=optimize)
# 合并图片
def hbimg(imgs,size,merge_name):
bhimgs = []
imgscount = int(math.ceil(len(imgs) / size))
for x in range(imgscount):
merge_images(imgs[size*x:size*(x+1)], True, x, 1)
bhimgs.append(f'{x}.png')
merge_images(bhimgs, True, merge_name, 2)
for x in range(imgscount):
os.remove(f'{x}.png')
if __name__ == '__main__':
# 注意文件夹路径斜杠
# 文件夹路径
filepath = "C:/photo"
# 合并后的名称
merge_name = "合并后的图片"
# 每一横排多少张图片
size = 5
# 开始合并
imgs = get_image_list(filepath)
print(imgs)
hbimg(imgs, size, merge_name)
基本上是可以实现的。如果想竖着一列合并 size改成1 ,也就是每一横排1张 也可以不用修改其他地方。对了,图片千万按顺序命名。可以打log出来看,如果读出来的顺序正确那么合并的就是正确的顺序。