python图片拼接


这两天看到一张图片,想用python来实现类似的图片拼接

 先分析图片:

  • 很明显,这张图片是由多张图片叠加拼接而成
  • 从最后一张开始开始叠加,之后的每张图片都往上平移了一个固定的距离并且附着在原有的图片上
  • 我们要做的就是控制这个距离,将所有需要的图片完成这个拼接

实操:

  • 获取所有需要的图片的资源

     def getAllImg(path):
    result = []
    filelist = os.listdir(path)
    for file in filelist:
    if os.path.isfile(os.path.join(path, file)):
    if file.split('.')[1] in ('jpg', 'png'):
    result.append(os.path.join(path, file))
    return result
  • 实现两张图片的拼接

     result = '/root/lambda/static/result.png'
    
     def join(png1, png2, size):
    img1, img2 = Image.open(png1), Image.open(png2)
    size1, size2 = img1.size, img2.size # 获取两张图片的大小
    joint = Image.new('RGB', (size1[0], size1[1] + size2[1] - size))
    # 新建一张新的图片
    # 因为拼接的图片的宽都是一样,所以宽为固定值
    # 高为两张图片的高相加再减去需要缩进的部分
    loc1, loc2 = (0, 0), (0, size1[1] - size)
    # 两张图片的位置
    # a-------------
    # | |
    # | |
    # | |
    # | |
    # | |
    # b------------|
    # | |
    # | |
    # | |
    # | |
    # |--------- --| # 位置都是以该图片的左上角的坐标决定
    # 第一张图片的左上角为a点,a的坐标为(0,0)
    # 第二张图片的左上角为b点,a的横坐标为0,纵坐标为第一张图片的纵坐标减去第二张图片上移的size: (0, size[1]-size) joint.paste(img2, loc2)
    joint.paste(img1, loc1)
    # 因为需要让第一张图片放置在图层的最上面,所以让第一张图片最后最后附着上图片上
    joint.save(result)
  • 循环递归调用

     def start(items, size, first_path=None):
    # 当first为None时,默认将第一张图片设置为图片列表的第一张图片,第二张图片设置为图片列表的第二张
    # 当这两张图片合成后,将图片列表的已经合成的图片元素移除
    # 然后将合成的图片设置为第一张图片,将剩余的没有合成的图片列表继续操作
    # 当first_path不为None,将第一张图片设置为first_path,第二张图片设置为传进来的列表的第一个元素
    # 合成之后,将刚刚使用的列表的元素删除
    # 最后递归函数,知道列表为空
    try:
    if not first_path:
    path1, path2 = items[0], items[1]
    join(path1, path2, size)
    items.remove(path1)
    items.remove(path2)
    return start(items, size, first_path=result)
    else:
    path2 = items[0]
    join(first_path, path2, size)
    items.remove(path2)
    return start(items, size, first_path=result)
    except:
    pass
  • 运行

     if __name__ == '__main__':
    s = getAllImg(path)
    s.sort()
    start(s, 100)
    print('最后图片尺寸--->', Image.open(result).size)
  • 效果展示

  • 图片文件
  • 1.png
  • 2.png

  • 3.png和1.png是同一张图片
  • 最终效果图
  • 这个中间的间隔是自己把握的,觉得不合适可以任意更换
  • 完整代码
  •  import os
    from PIL import Image result = '/root/lambda/static/result.png' # 图片保存路径 def join(png1, png2, size):
    img1, img2 = Image.open(png1), Image.open(png2)
    size1, size2 = img1.size, img2.size # 获取两张图片的大小
    joint = Image.new('RGB', (size1[0], size1[1] + size2[1] - size))
    # 新建一张新的图片
    # 因为拼接的图片的宽都是一样,所以宽为固定值
    # 高为两张图片的高相加再减去需要缩进的部分
    loc1, loc2 = (0, 0), (0, size1[1] - size)
    # 两张图片的位置
    # a-------------
    # | |
    # | |
    # | |
    # | |
    # | |
    # b------------|
    # | |
    # | |
    # | |
    # | |
    # |------------| # 位置都是以该图片的左上角的坐标决定
    # 第一张图片的左上角为a点,a的坐标为(0,0)
    # 第二张图片的左上角为b点,a的横坐标为0,纵坐标为第一张图片的纵坐标减去第二张图片上移的size: (0, size[1]-size) joint.paste(img2, loc2)
    joint.paste(img1, loc1)
    # 因为需要让第一张图片放置在图层的最上面,所以让第一张图片最后最后附着上图片上
    joint.save(result) def start(items, size, first_path=None):
    # 当first为None时,默认将第一张图片设置为图片列表的第一张图片,第二张图片设置为图片列表的第二张
    # 当这两张图片合成后,将图片列表的已经合成的图片元素移除
    # 然后将合成的图片设置为第一张图片,将剩余的没有合成的图片列表继续操作
    # 当first_path不为None,将第一张图片设置为first_path,第二张图片设置为传进来的列表的第一个元素
    # 合成之后,将刚刚使用的列表的元素删除
    # 最后递归函数,知道列表为空
    try:
    if not first_path:
    path1, path2 = items[0], items[1]
    join(path1, path2, size)
    items.remove(path1)
    items.remove(path2)
    return start(items, size, first_path=result)
    else:
    path2 = items[0]
    join(first_path, path2, size)
    items.remove(path2)
    return start(items, size, first_path=result)
    except:
    pass path = '/root/lambda/' # 图片文件夹路径 def getAllImg(path):
    result = []
    filelist = os.listdir(path)
    for file in filelist:
    if os.path.isfile(os.path.join(path, file)):
    if file.split('.')[1] in ('jpg', 'png'):
    result.append(os.path.join(path, file))
    return result if __name__ == '__main__':
    s = getAllImg(path)
    s.sort()
    start(s, 100)
    print('最后图片尺寸--->', Image.open(result).size)

 

python图片拼接的更多相关文章

  1. python实现单张图像拼接与批量图片拼接

    本文实例为大家分享了python实现图像拼接的具体代码,供大家参考,具体内容如下 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经 ...

  2. python:图片拼接

    一:尺寸相同的图片拼接 import os from PIL import Image width_i = 200 height_i = 200 row_max = 3 line_max = 3 al ...

  3. Python 实现auto linlink 连连看

    先上知乎上大神所写: 你看过/写过哪些有意思的代码? 然后别急着看blog,玩一把游戏再说! 看知乎评论,有人说他用了一个下午时间就写出来了. wo kao!!! 我断断续续写了一周的下午才搞定,然后 ...

  4. python图片云

    Python 小工具 把图片拼接成任意大小新图片 代码比较简单 看注释就好 # -*- coding:utf-8 -*- #图片拼接 import PIL.Image as Image import ...

  5. Python pillow库

    由于pillow库功能很强大本文章主要介绍pillow的Image模块 关于Pillow与PIL PIL(Python Imaging Library)是Python一个强大方便的图像处理库,名气也比 ...

  6. 基于OpenCV全景拼接(Python)SIFT/SURF

    一.实验内容: 利用sift算法,实现全景拼接算法,将给定的两幅图片拼接为一幅. 二.实验环境: 主机配置: CPU :intel core i5-7300 2.50GHZ RAM :8.0GB 运行 ...

  7. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  8. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  9. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

随机推荐

  1. 5.创建app、创建user表、配置media、数据迁移

    目录 user模块User表 创建user模块 创建User表对应的model:user/models.py 注册user模块,配置User表:dev.py 配置media 数据库迁移 user模块U ...

  2. 关于Addressable的疑问

    1)关于Addressable的疑问2)Addressable如何进行热更新3)如何设置SceneView相机的Shader变量4)Activity默认为SingleTask的原因5)关于Resour ...

  3. 创建Sphinx + GitHub + ReadtheDocs托管文档

    最新博客链接 "Tsanfer's Blog" 创建Sphinx + GitHub + ReadtheDocs托管文档 Readthedocs在线电子书链接

  4. 是时候了解Java Socket底层实现了

    在Java中,提供了一系列Socket API,可以轻松建立两个主机之间的连接.读取数据,那底层到底怎么实现,很少人去关心.这其实最终还是通过调用操作系统提供得Socket接口完成(TCP/IP是由操 ...

  5. 安装SQL Server 2008R2 报错“此计算机上安装了 Microsoft Visual Studio 2008 的早期版本”解决方法

    安装SQL Server 2008 R2报错“此计算机上安装了 Microsoft Visual Studio 2008 的早期版本,请在安装 SQL Server 2008 前将 VS2008 升级 ...

  6. Loadrunner 11安装和破解

    一.安装环境和文件准备 1.操作系统:Windows Server 2008 R2 Enterprise: 2.loadrunner版本:loadrunner 11: 3.安装浏览器:火狐39.0: ...

  7. Java并发包下锁学习第二篇Java并发基础框架-队列同步器介绍

    Java并发包下锁学习第二篇队列同步器 还记得在第一篇文章中,讲到的locks包下的类结果图吗?如下图: ​ 从图中,我们可以看到AbstractQueuedSynchronizer这个类很重要(在本 ...

  8. PAT-B 1005. 继续(3n+1)猜想 (25) c++

    1005. 继续(3n+1)猜想 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 卡拉兹(Callatz ...

  9. node.js初步

    Node.js介绍 Node.js 诞生于2009年,Node.js采用C++语言编写而成,是 一个Javascript的运行环境.Node.js 是一个基于 Chrome V8 引擎的 JavaSc ...

  10. 大O 表示法

    大O表示法 指出了算法有多快.例如,假设列表包含n个元素.简单查找需要检查每个元素,因此需要执行n次操作.使用大O表示法,这个运行时间为O(n).单位秒呢?没有——大O表示法指的并非以秒为单位的速度. ...