最近在帮人处理聊天记录,由于图片实在太多了,懒得一张张拼在一起,所以网上找了关于python拼接图片的技术文章,但是这篇技术文章没有批量处理的功能,所以我浅改一下,在此纪录。
这是我参考的文章链接:python-PIL库的基本使用和实现图片拼接 - 知乎 (zhihu.com)
这是我更改之后的代码:
import os
from PIL import Image
from random import sample, choices
COL = 2 # 指定拼接图片的列数
ROW = 2 # 指定拼接图片的行数
UNIT_HEIGHT_SIZE = 1136 # 图片高度
UNIT_WIDTH_SIZE = 640 # 图片宽度
PATH = "E:\书\无语了\聊天记录4\\" # 需要拼接的图片所在的路径
NAME = "result" # 拼接出的图片保存的名字
RANDOM_SELECT = False # 设置是否可重复抽取图片
SAVE_QUALITY = 50 # 保存的图片的质量 可选0-100
# 进行图片的复制拼接
def concat_images(image_names, name, path, num):
image_files = []
for index in range(COL * ROW):
image_files.append(Image.open(path + image_names[index])) # 读取所有用于拼接的图片
target = Image.new('RGB', (704 + UNIT_WIDTH_SIZE * COL, 534 + UNIT_HEIGHT_SIZE * ROW), 'white') # 创建成品图的画布
# 第一个参数RGB表示创建RGB彩色图,第二个参数传入元组指定图片大小,第三个参数可指定颜色,默认为黑色
for row in range(ROW):
for col in range(COL):
# 对图片进行逐行拼接
# paste方法第一个参数指定需要拼接的图片,第二个参数为二元元组(指定复制位置的左上角坐标)
# 或四元元组(指定复制位置的左上角和右下角坐标)
target.paste(image_files[COL * row + col], (352 + UNIT_WIDTH_SIZE * col, 267 + UNIT_HEIGHT_SIZE * row))
target.save(path + name + str(num) + '.jpg', quality=SAVE_QUALITY) # 成品图保存
if __name__ == '__main__':
image_names = list(os.walk(PATH))[0][2] # 获取目标文件夹下的所有文件的文件名
print(len(image_names))
n = 0
for i in range(0, len(image_names)-1, 4):
n = n + 1
concat_images(image_names[i:i+4], NAME, PATH, n)
注意事项:
1、 需要根据自己的需求更改图片大小
UNIT_HEIGHT_SIZE = 1136 # 图片高度
UNIT_WIDTH_SIZE = 640 # 图片宽度
2、这里需要填写自己需要批量处理图片的存储路径,这是我自己的路径,而且路径最后那是两条斜杠
PATH = "E:\书\无语了\聊天记录4\\" # 需要拼接的图片所在的路径
3、这是生成画布的代码,我自己有更改过,因为需要A4大小,并且周围要有白边
target = Image.new('RGB', (704 + UNIT_WIDTH_SIZE * COL, 534 + UNIT_HEIGHT_SIZE * ROW), 'white') # 创建成品图的画布
这是粘贴图片的代码,也是更改过的
target.paste(image_files[COL * row + col], (352 + UNIT_WIDTH_SIZE * col, 267 + UNIT_HEIGHT_SIZE * row))
如果只是想单纯的拼接图片,只需要这样写即可:
target = Image.new('RGB', (UNIT_WIDTH_SIZE * COL, UNIT_HEIGHT_SIZE * ROW), 'white')
target.paste(image_files[COL * row + col], (UNIT_WIDTH_SIZE * col, UNIT_HEIGHT_SIZE * row))
最终效果如下: