python图片拼接
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图片拼接的更多相关文章
- python实现单张图像拼接与批量图片拼接
本文实例为大家分享了python实现图像拼接的具体代码,供大家参考,具体内容如下 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经 ...
- python:图片拼接
一:尺寸相同的图片拼接 import os from PIL import Image width_i = 200 height_i = 200 row_max = 3 line_max = 3 al ...
- Python 实现auto linlink 连连看
先上知乎上大神所写: 你看过/写过哪些有意思的代码? 然后别急着看blog,玩一把游戏再说! 看知乎评论,有人说他用了一个下午时间就写出来了. wo kao!!! 我断断续续写了一周的下午才搞定,然后 ...
- python图片云
Python 小工具 把图片拼接成任意大小新图片 代码比较简单 看注释就好 # -*- coding:utf-8 -*- #图片拼接 import PIL.Image as Image import ...
- Python pillow库
由于pillow库功能很强大本文章主要介绍pillow的Image模块 关于Pillow与PIL PIL(Python Imaging Library)是Python一个强大方便的图像处理库,名气也比 ...
- 基于OpenCV全景拼接(Python)SIFT/SURF
一.实验内容: 利用sift算法,实现全景拼接算法,将给定的两幅图片拼接为一幅. 二.实验环境: 主机配置: CPU :intel core i5-7300 2.50GHZ RAM :8.0GB 运行 ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
随机推荐
- 每天都在用 Map,这些核心技术你知道吗?
本篇文章站在多线程并发安全角度,带你了解多线程并发使用 HashMap 将会引发的问题,深入学习 ConcurrentHashMap ,带你彻底掌握这些核心技术. 全文摘要: HashMap 核心技术 ...
- (转)协议森林08 不放弃 (TCP协议与流通信)
协议森林08 不放弃 (TCP协议与流通信) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! TCP(Transportation ...
- javaScript 基础知识汇总 (十二)
1.属性的标志和描述符 属性的标志 对象属性除value外还有三个特殊属性,即标志 writable ----如果为true,则可以修改,否则它只是只读的. enumerable ----如果为tru ...
- 【分布式锁】02-使用Redisson实现公平锁原理
前言 前面分析了Redisson可重入锁的原理,主要是通过lua脚本加锁及设置过期时间来保证锁执行的原子性,然后每个线程获取锁会将获取锁的次数+1,释放锁会将当前锁次数-1,如果为0则表示释放锁成功. ...
- kerberos系列之zookeeper的认证配置
本篇博客介绍配置zookeeper的kerberos配置 一.zookeeper安装 1.解压安装包和重命名和创建数据目录 tar -zxvf /data/apache-zookeeper-3.5.5 ...
- 【转】Java JDBC对应C# ADO连接数据库之区别
JDBC对应C#连接数据库之区别 之前一直在用java,最近因为找了.NET的工作,开始学习.NET. 今天也是查了好多资料,但是一直没有看到和JDBC之间的对比博文,开始也是一头雾水! 但是功夫不负 ...
- 基于Docker搭建Nginx图片服务器
前言 一般开发中,都会把图片上传到一个目录,然后将目录和文件名拼接存储在数据库中,但是,这种方法如果没弄好的话可能有一定的缺陷. 若项目搬迁,即时这台服务器本身还在用,存放在服务器的跟项目相关的图片也 ...
- hackerone或PayPal转账到国内银行卡
1.首先hackerone会提示有W9那么一说,这个是美国人纳税的,我们是中国人不需要纳税的,只要给美国税务局发邮件说你是中国人不需要纳税就OK了.具体操作百度. 2.如此就会成功转账到你的PayPa ...
- hdu4107Gangster 线段树
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/4107/ 题目给定一个初始值都是零的序列,操作只有一种,就是给一个区间加上一个数,但是当一个数大于等于给定的P的时 ...
- F版本SpringCloud 4—Eureka注册中心开发和客户端开发
源码地址:https://gitee.com/bingqilinpeishenme/Java-Tutorials 前言 通过前三篇文章,用大白话介绍了微服务和SpringCloud以及服务治理相关的概 ...