python使用PIL库批量拼接图片

595 阅读2分钟

最近在帮人处理聊天记录,由于图片实在太多了,懒得一张张拼在一起,所以网上找了关于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))

最终效果如下:

图片