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)

合并结果小图看不清,就不展示了,和上面的一样,图片有留白的区域

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔_51

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值