• Python合并拼接图片


    使用前需要安装PIL库,以下代码使用的Pillow(10.1.0)

    pip install pillow
    
    • 1

    图片二维合并拼接(类似九宫格)

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    图片纵向合并拼接

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    举例

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    18张图片合并为2张九宫格图片

    统一原始图片尺寸,举例中调用函数合并图片行代码

    img_merge1(img_list, file_name, 3, 3)
    
    • 1

    合并前(内含17张jpg图片和1张png图片)
    在这里插入图片描述
    合并后
    在这里插入图片描述
    如果不需要统一原始图片尺寸

    img_merge1(img_list, file_name, 3, 3, False)
    
    • 1

    合并后,可以清楚的看到图片有留白的区域
    在这里插入图片描述

    18张图片合并为2张纵向图片

    统一原始图片尺寸,举例中调用函数合并图片行代码

    img_merge2(img_list, file_name)
    
    • 1

    合并后
    在这里插入图片描述
    同样,如果不需要统一原始图片尺寸

    img_merge2(img_list, file_name, False)
    
    • 1

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

  • 相关阅读:
    计算机毕业设计Java优乐帮育儿系统(系统+程序+mysql数据库+Lw文档)
    13基于PCA的人脸识别,程序已调通,可将自己的数据替换进行识别,得到识别准确率结果,MATLAB平台。
    JavaScipt基础(持续更新一)
    【力客热题HOT100】-【054】152 乘积最大子数组
    PSP - 蛋白质复合物结构预测 Template 的 Multichain Mask 2D (二维多链掩码)
    COCI2022-2023#1 Neboderi
    js识别爬虫,js识别手机,识别文章标题后js跳转
    Spark实现二次排序
    代码整洁之道 命名变量的艺术
    Linux开机启动流程/socket/软中断和硬中断
  • 原文地址:https://blog.csdn.net/hhhhh_51/article/details/134273986