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. Python操作系统

    一 为什么要有操作系统 (两本书:现代操作系统.操作系统原理,学好python以后再去研究吧~~) 现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输 ...

  2. [头脑风暴] 解读Docker Bridge网络模型

    背景 这几天在研究Kubernetes, 遇到一个有意思的nodejs镜像:luksa/kubia # 不带端口映射启动容器docker run -it -d luksa/kubia# 连接到默认的B ...

  3. javaScript 基础知识汇总(七)

    1.数组 特点:数组是可以存储有序集合的对象. 声明: let arr = new Array();   let arr=[]; 大多数情况下我们使用第二种. let fruits = [" ...

  4. iviewadmin url 加入 Router base #viewDesignAdmin

    router/index.js const router = new Router({   routes,   base: '/viewDesignAdmin/',   mode: 'history' ...

  5. void指针和数组指针之间的转换

    由于void* 可以被任何指针赋值,所以以void*作为函数参数可以使得接口更容易接受不同类型的参数,不过需要注意的时,实际操作时还需要利用强制类型转换,将指针转换为原类型,否则在内存上会有问题. 一 ...

  6. Zetatier One 基本用法

    Zetatier One 基本用法 ZeroTier One是用加密的点对点技术将处于不同物理位置的网络建立私人的局域网,即使用软件实现路由和交换机功能,而且它能使用WEB控制台管理网络,是对SDN( ...

  7. JAVA 转换 树结构数据

    JAVA 转换 树结构数据 第一步:引入fastjson <dependency> <groupId>com.alibaba</groupId> <artif ...

  8. 【转】Typora极简教程

    Typora极简教程 Typora download ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易读易写的纯文本格式编写文档,然后转 ...

  9. 【2019HDU多校】第九场1006/HDU6685-Rikka with Coin——位运算打表

    题目链接 题目大意 使用10.20.50.100元面额的硬币能分别组成题目给出的面额,需要最少的硬币个数 分析 一开始队友想用一堆if-else解决问题,然后WA了无数发-- 我想到了一种比较简单的打 ...

  10. 介绍 Seq2Seq 模型

    2019-09-10 19:29:26 问题描述:什么是Seq2Seq模型?Seq2Seq模型在解码时有哪些常用办法? 问题求解: Seq2Seq模型是将一个序列信号,通过编码解码生成一个新的序列信号 ...