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)

 

最新文章

  1. T-SQL 基础学习 01
  2. Issue 4:分布式的基础性问题
  3. Tomcat部署记事
  4. supersr--NSURLSessionConfiguration-下载进度
  5. HTML与XHTML
  6. Python小爬虫-自动下载三亿文库文档
  7. 容器适配器之priority_queue
  8. Linux网络编程8——对TCP与UDP的简易封装
  9. Careerup上的简历模板
  10. js之正则表达式(下)
  11. Python 爬虫入门(requests)
  12. mvc4 membership, [Win32Exception (0x80004005): The system cannot find the file specified]
  13. django: db - admin
  14. 记录一次webbrowser无法加载 activex 遇到的问题
  15. Fox And Jumping
  16. python进程和线程(四)
  17. Django 加载 app 中的urls
  18. 8.docker的安全性
  19. LeetCode 81 - 搜索旋转排序数组 II - [二分+暴力]
  20. Velocity中判断是否为空

热门文章

  1. juery 实现选项卡
  2. yarn安装Electron提示安装正常却实际没有安装的解决
  3. Java 锁详解(转)
  4. 039.集群网络-Pod和SVC网络实践
  5. Java并发编程之CAS第一篇-什么是CAS
  6. selenium 使用教程详解-java版本
  7. 在linux系统把node安装到全局 简单记录
  8. CF 1012C Dp
  9. nltk 中的 sents 和 words
  10. python3读取excel