Python合并拼接图片

news2024/11/15 20:37:20

目录

    • 图片二维合并拼接(类似九宫格)
    • 图片纵向合并拼接
    • 举例
      • 18张图片合并为2张九宫格图片
      • 18张图片合并为2张纵向图片

使用前需要安装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)

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

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

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

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

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

img_merge2(img_list, file_name)

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

img_merge2(img_list, file_name, False)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1181572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

趣玩行为商城:用智能消费行为开启财富新生活!

随着当前的消费主力转移至90后和Z时代&#xff0c;购物和消费习惯已经发生了翻天覆地的变化。以往那种大超市&#xff0c;线下大卖场、超级Mall综合体逐渐式微&#xff0c;以“健康生活”、“智能消费”“社区直达”为主的消费理念逐渐兴盛&#xff0c;消费者开始更多地关注此类…

sqli-labs-1

文章目录 Less-01Less-02Less-03Less-04 Less-01 1.输入不同的id值&#xff0c;可以获取不同的用户信息&#xff1a; 2.在sql后拼接’or11–&#xff0c;并没有获取到所有用户的信息&#xff0c;猜测可能用了limit语句 3.构造错误的sql语句&#xff0c;果然有limit报错: …

简历考察点1_《基于 VUE2.0 前后端分离的个人博客系统》

项目名称&#xff1a;《基于 Vue2.0①前后端分离的个人博客系统》 项目描述&#xff1a;提供最新技术资讯、开发知识和分享的博客平台&#xff0c;功能模块包括&#xff1a;支持不同用户登录注册、编辑并发布博客、上传图片、评论留言、根据访问量查询最热文章和标签、根据日期…

VM虚拟机逆向---[羊城杯 2021]Babyvm 复现【详解】

文章目录 前言题目分析汇编脚本分析汇编exp 后言 前言 无 题目分析 &unk_804B0C0里面是opcode&#xff0c;sub_1C8里面有个mprotect&#xff0c;用了一个SMC加密。 我使用的是动态调试&#xff0c;因为是ELF文件&#xff0c;链接一下linux&#xff0c;进行动调&#xff…

Android11修改连接WiFi后AP端显示的设备名

修改build.prop文件 1.修改 /system/build.prop 最后添加&#xff0c;xxx 为自己设置的设备名&#xff1a; net.hostnamexxx 2. 重启、重连wifi&#xff0c;从热点或路由器后台查看设备名即为修改后的名称 代码里动态配置 暴力手段&#xff1a;grep -rn “net.hostname” *…

matlab中的iddata函数的初步理解和使用程序举例

matlab中的iddata函数的初步理解和程序举例 一、iddata函数功能 iddata函数常用于系统识别分析领域数据分析方面。该函数在时域或频域中&#xff0c;将用于系统识别的输入输出数据及其特性数据的生成对象数据类型。即&#xff0c;可以使用iddata函数封装要标识的系统的输入和…

【Transformer从零开始代码实现】(一)输入部件:embedding+positionalEncoding

Transformer总架构图 输入相关组件 输入部分&#xff1a; 源文本嵌入层位置编码器目标文本嵌入层位置编码器 &#xff08;1&#xff09;Embedding 首先&#xff0c;需要对输入的内容进行向量化。 1&#xff09;先导示例 nn.Embedding示例&#xff1a; # 10代表嵌入的数…

即插即用篇 | YOLOv8 引入反向残差注意力模块 iRMB | 《ICCV 2023 最新论文》

论文地址:https://arxiv.org/abs/2301.01146 代码地址:https://github.com/zhangzjn/EMO 本论文着重于开发现代、高效、轻量级的模型,用于进行密集预测,同时在参数、FLOPs和性能之间进行权衡。倒置残差块(IRB)作为轻量级CNN的基础设施,但在基于注意力的研究中尚未找到对…

目标检测中的评价指标

目标检测中的评价指标 将检测目标分为正样本和负样本。 真阳性&#xff08;true positives , TP&#xff09; : 正样本被正确识别为正样本。 假阳性&#xff08;false positives, FP&#xff09;: 负样本被错误识别为正样本。 假阴性&#xff08;false negatives, FN&#…

技术分享 | app自动化测试(Android)-- 参数化用例

参数化是自动化测试的一种常用技巧&#xff0c;可以将测试代码中的某些输入使用参数来代替。以百度搜索功能为例&#xff0c;每次测试搜索场景&#xff0c;都需要测试不同的搜索内容&#xff0c;在这个过程里面&#xff0c;除了数据在变化&#xff0c;测试步骤都是重复的&#…

Java附件和base64相互转换

1 文件转base64 声明&#xff1a;我用的是Hutool的Base64下的api package cn.hutool.core.codec; 首先找一张图片 很简单&#xff0c;直接使用Base64的encode方法就可以拿到文件的base64码&#xff1a; File file new File("D:\\Tools\\Images\\北极熊.jpg");String…

软件测试面试题汇总,(测试技术+人力资源+进阶规划)含2023面试题和答案总结

什么是兼容性测试&#xff1f;单元测试的策略有哪些&#xff1f;当开发人员说不是BUG时&#xff0c;你如何应付&#xff1f;等&#xff0c;尾部有最新BAT的Python高级自动化工程师面试题目和答案福利&#xff0c;想要的就快来领走吧&#xff01;&#xff08;领取方式见文末&…

【机器学习3】有监督学习经典分类算法

1 支持向量机 在现实世界的机器学习领域&#xff0c; SVM涵盖了各个方面的知识&#xff0c; 也是面试题目中常见的基础模型。 SVM的分类结果仅依赖于支持向量&#xff0c;对于任意线性可分的两组点&#xff0c;它 们在SVM分类的超平面上的投影都是线性不可分的。 2逻辑回归 …

安装 MinGW

实际上是将 GCC&#xff08;C语言编译器&#xff09; 移植到了 Windows 平台下。 1、网上下载 下载安装器 mingw-get-setup.exe&#xff0c;路径https://osdn.net/projects/mingw/ 2、打开点击install 3、选择路径continue 4、文件加载完成之后选择continue 5、勾选这两个 6…

数据结构与算法之美学习笔记:17 | 跳表:为什么Redis一定要用跳表来实现有序集合?

目录 前言如何理解“跳表”&#xff1f;用跳表查询到底有多快&#xff1f;跳表是不是很浪费内存&#xff1f;高效的动态插入和删除跳表索引动态更新解答开篇内容小结 前言 本节课程思维导图&#xff1a; 二分查找底层依赖的是数组随机访问的特性&#xff0c;所以只能用数组来实…

润色论文Prompt

你好&#xff0c;我现在开始写论文了&#xff0c;我希望你可以扮演帮我润色论文的角色我写的论文是关于xxxxx领域的xxxxx&#xff0c;我希望你能帮我检查段落中语句的逻辑、语法和拼写等问题我希望你能帮我检查以下段落中语句的逻辑、语法和拼写等问题同时提供润色版本以符合学…

freeswich学习

写在前面 因为所在部分主要负责公司客服业务&#xff0c;需要了解freeswich相关内容&#xff0c;所以这里将学习内容记录下。 1&#xff1a;安装freesswich freeswich是一个实现了软交换协议的开源软件&#xff0c;可以对对接运营上的通话线路&#xff0c;实现拨打电话。 安…

编程未来规划笔记

编程思考 Python 自动化办公、深度学习、自然语言处理&#xff08;调用各种库&#xff09; Html Css 写网页 学习不要怕忘 为什么学的快、忘得快 Google、写代码、放文档 高度提炼 学什么&#xff1b;存在的意义是什么 更好的拓展性&#xff1b;可维护性 实践 原理 顶层设计…

建材行业微信小程序制作全攻略

随着移动互联网的发展&#xff0c;微信小程序成为各行各业推广和服务的新方式。对于建材行业来说&#xff0c;制作一个微信小程序商城能够提供更方便快捷的购买途径&#xff0c;提升用户体验。下面将为大家介绍建材行业微信小程序制作的全攻略。 第一步&#xff1a;注册登录账号…

人工智能一种现代的方法 第四章 非经典搜索 上(局部搜索)

文章目录 人工智能一种现代的方法 第四章 非经典搜索 上前言4.1 局部搜索4.1.1 爬山法4.1.2 爬山法变形4.1.3模拟退火搜索4.1.4 局部束搜索4.1.5 遗传算法 4.2 连续空间的局部搜索4.2.1 梯度下降4.2.2 约束优化 小结 人工智能一种现代的方法 第四章 非经典搜索 上 前言 在第三…