原标题:来得瑟一下!用Python做一个缩放自如的圣诞老人

圣诞节又要到了,虽说我们中国人不提倡过西方的节日, 但是商家们还是很喜欢的,估计有对象的男孩纸女孩纸们也很喜欢吧。

今天的主题是为大家展示如何用 python做一个不断变大的圣诞老人,就像西游记中能够随意变幻大小的神仙妖怪那样,算是送给大家的小礼物,先上个图吧!

不要心急,盯着图片看5秒

思路要点:

通过缩放获取等比大小的一组图片

将上述图片叠加到固定大小的底图中

按顺序组合图片生成动图

1

图片缩放

本篇文章的大部分工作都是基于opencv实现,而opencv进行图片缩放是极其容易的,不过这次我们要生成的是一组等比缩放的图片,所以在cv2.resize方法的使用上可能跟以往略有出入,先来看函数原型:

cv2.resize( src, dsize[, dst[, fx[, fy[, interpolation]]]])

其中src是原图片,dsize是目标图片大小,当dsize为0的时候,我们就可以通过fx和fy两个参数来分别设置水平轴和垂直轴方向的缩放比例了。这样说可能有些抽象,我们举个例子来说明:

fori in range( 1, 40, 1):

img = cv2. resize(image, ( 0, 0), fx=i/ 30, fy=i/ 30)

cv2.imwrite(str(i)+ '.png', img)

运行上面这段代码会生成39张不同比例的图片,目标图片的大小由缩放比例fx和fy来控制,最小的一幅图边长是原图的1/30,最大的图片边长是原图的1.3倍(下图):

既然等比缩放的图片有了,是不是可以选定一个坐标原点,直接合成动图呢?答案是不行,因为常规的动图生成方法要求素材图片必须是相同的尺寸(像素),下面我们就来着重解决这一问题。

2

底图叠加

python中实现两幅图片叠加的办法有很多,但是他们都存在缺陷——要么叠加的图片必须是相同大小,要么难以控制图片叠加的具体位置。对此,小编采取的办法是在两幅图之间进行“像素级”的替换。

1).生成底图

待叠加的图片中,上层图片就使用刚才获取到的一系列等比缩放图,下层图片我们就生成一张固定大小的空白图片。需要注意,这里生成的空白图片必须大于最大的一幅缩放图。

生成空白底图分两步完成,第一步生成固定大小(垂直轴和水平轴的长度)的二维数组;第二步使用cv2.cvtColor进行颜色空间变换。代码如下:

blank= np. ones((blankh, blankw), dtype=np.uint8) * 255

ret= cv2.cvtColor(blank, cv2.COLOR_GRAY2BGR)

其实上面代码中的ret本质上是一个三维数组,我们可以把它打印出来查看(下图),但是通过cv2.imshow方法展示出来就是一张空白图片了。这其中涉及一些较为底层的内容,大家了解就好,文中不再赘述。

2).像素替换

正如刚才所说,opencv中的一幅图其实是一个三维数组,其实也可以把它看作是二维数组,数组中的

每个元素是形如 [255, 255, 255] 的列表,其中存放的是图片每个像素的颜色参数。也就是说,如果我们想实现一幅图片叠加到另一幅图片这样的视觉效果,可以对被叠加图片对应位置的

像素进行替换赋值。代码形式如下图所示,其中i和j分别为图片在垂直方向和水平方向的坐标。

ret[i, j, 0] = image[i, j, 0]

ret[i, j, 1] = image[i, j, 1]

ret[i, j, 2] = image[i, j, 2]

对一幅图片而言,坐标原点是在左上角(下图所示)。此外,为了保证最终得到动图的效果,不能简单的将图片以坐标原点为基准进行叠加,最好的办法是把叠加原点设在底图下边缘的中心位置。

原理搞清楚后就可以开始图片叠加操作了,在此期间需要进行一些像素对应位置的计算,虽然稍微有点绕但是并不复杂,详细的转化公式就不写了,我们直接看代码:

上面代码中的image是已经缩放完毕的圣诞老人图片,blankh和blankw分别是空白图片的高度和宽度,这个尺寸可以根据需求自行设置。

下图展示的是一幅缩放比例1/2左右的图片和底图叠加后的效果,为了观察方便,我给图片加了一个边框。

3

生成动图

之前我们已经解决了单幅图片与底图的叠加,为了准备合成动图所需素材,还要对多个等比缩放的图片进行底图叠加操作。缩放比例间隔越小、准备的图片素材越多,生成的动图也就越平滑。

当然,动图的效果如何还要综合考虑多个因素, 这里小编还是采用39幅图片组合动图。其中最小的图形高度是原图的1/30,最大的图形高度是原图的1.3倍。与底图叠加后的图片就是下面这个样子。

下面来说说动图的合成,将多个相同尺寸的图片合成动图可以使用 imageio 这个库来实现,核心代码只有一条:

imageio.mimwrite( '目标文件名称.gif', gifList, duration= 0.15)

其中第一个参数是git目标文件名称;gifList是一组列待合成的图片,也就是上面图片中展示的那些;最后一个参数duration表示画面切换间隔,单位为秒。

现在通过下面这段代码进行动图合成。

file_path = 'pic'

imgList = os.listdir(file_path)

imgList = [ 'pic/'+img forimg inimgList]

gifList = [imageio.imread(img) forimg inimgList]

imageio.mimwrite( 'gif.gif', gifList, duration=0.15)

来看合成后的动图效果(下图),仔细看看好像有点问题,怎么图中的圣诞老人忽大忽小?这跟我们预想的不一样啊。

其实这个问题是出在合成图片的顺序上,我们尝试打印上面代码中的 imgList 变量,结果如下:

可以看到,素材图片并不是按照我们预想的顺序排序。这在python的文件处理中也算是个比较常见的问题,解决方案之一是可以按照图片的创建时间排序,具体操作是在上面的第二行代码之后插入一条语句:

imgList= sorted(imgList,key=lambda x: os.path.getmtime(os.path.join(file_path, x)))

现在再次进行动图合成,就可以实现文章开头的效果了。

当然了,这种动图制作方法不仅限于圣诞老人,任何图片理论上都是可以的。比如说, 我们还可以做一棵不断长大的圣诞树!

看下面的视频,一睹为快!

趣味游戏文章:

Python心得和技巧:返回搜狐,查看更多

责任编辑:

python画圣诞老人图片_来得瑟一下!用Python做一个缩放自如的圣诞老人相关推荐

  1. 来得瑟一下!用Python做一个缩放自如的圣诞老人

    圣诞节又要到了,虽说我们中国人不提倡过西方的节日,但是商家们还是很喜欢的,估计有对象的男孩纸女孩纸们也很喜欢吧. 今天的主题是为大家展示如何用python做一个不断变大的圣诞老人,就像西游记中能够随意 ...

  2. 用python做一个缩放自如的鸣人

    首先,我要非常感谢微信公众号"菜鸟学Python"的作者,是他分享了用python做一个缩放自如的圣诞老人的想法及程序. 我按照作者分享的程序整理了一下,做了一个缩放自如的鸣人,这 ...

  3. python画大学教室_开学季,用Python画大学教室座位神分区图,你中枪了吗?

    这就用Python给大家画这幅有趣的神分区图,看看是不是跟你的情况一样呢? 基本思路:我们将画布分成若干子画布,这些子画布构成绘图区域,在这些绘图区域上分别绘制图形,这就让我们想到函数subplot2 ...

  4. 用python字符画生日快乐图片_手把手教你用python将图片做成字符画!

    字符视觉排序 我们可以看到list中左边的字符视觉上较深,右边的字符视觉上较浅. 打开图片,调整大小 打开我们需要转化的图片,并将图片调整为我们所指定的宽和高(字符画的宽和高) 我们使用PIL来进行图 ...

  5. 简单python画圣诞树图片-圣诞节!教你用 Python 画棵圣诞树

    原标题:圣诞节!教你用 Python 画棵圣诞树 作者 | 糖甜甜甜 责编 | 胡巍巍 如何用Python画一个圣诞树呢? 最简单: 1height = 5 2 3stars = 1 4for i i ...

  6. python画圣诞树图片_庆祝新年?画一颗圣诞树?还是...

    关于节日 圣诞节,元旦,看大家(情侣)在朋友圈里发各种庆祝的或者祝福的话语,甚是感动,然后悄悄拉黑了.作为单身狗,我们也有自己庆祝节日的方式,今天我们就来实现一些祝福的效果. 需要说明的是,所有的效果 ...

  7. python画圆形螺旋线_中秋节到了,送你一个Python做的Crossin牌“月饼”

    明天是难得一见的国庆中秋双节合一,在这里除了祝大家节日快乐之外,我们还要送上一个"月饼"--当然这个月饼是不能吃的,因为它是用python做的.先给大家看一下效果图. 图1. 月饼 ...

  8. python画玫瑰图_三步学会用python画一个简单的玫瑰图

    玫瑰图实际是一种2维极坐标统计图,常用于表示气象.气候现象,如测站的风向频率等.用excel也可以画,但相对麻烦一些,所以当我们需要用到玫瑰图时,我们可以尝试用python来画.首先导入需要用到的包 ...

  9. python文字转图片_技能:如何使用Python将文本转为图片

    更多腾讯海量技术文章,请关注云加社区:https://cloud.tencent.com/developer/column 作者:CDA数据分析师 摘要:有时候,我们需要将文本转换为图片,比如发长微博 ...

最新文章

  1. mes生产管理的定义
  2. 【转】解决多文件编译中连接错误 multiple definition of*****
  3. 将VMware Workstation 12 Pro的虚拟网卡修改为自己希望的IP网段
  4. CSS清除默认样式,聪明人已经收藏了!
  5. 强化学习案例_强化学习实践案例!携程如何利用强化学习提高酒店推荐排序质量...
  6. 给入门级程序员的忠告
  7. 简单python脚本实例-对Python实现简单的API接口实例讲解
  8. Catch That Cow抓住那只奶牛(BFS,广度优先搜索)
  9. matlab物理应用编程,MATLAB在普通物理中的应用
  10. 碰到一个非常郁闷的事
  11. GitHub项目推荐
  12. (一)LINGO入门---软件安装
  13. MIKE水动力笔记6_如何自己制作实测数据的时间序列文件dfs0
  14. 一键重启tomcat
  15. matlab 画光束等相面,拉盖尔高斯光束_厄米高斯光束MATLAB仿真 - 范文中心
  16. 英语黑色幽默IT段子
  17. 区块链金融中的python应用--LSM定价
  18. C++20,说说 Module 那点事儿
  19. 【LINUX】系统安全
  20. Qt Qss 渐变颜色设置

热门文章

  1. 前端特效【第04期】|果汁混合效果-下
  2. QT防止锁屏工具(QT模拟Windows按键按下)
  3. 用户体验管理 - Managing user experience
  4. 【032期】2021年 Java 面试中 Linux 最高频的五个基本面试题
  5. Win7 连接局域网共享之后 提示错误代码:0x800704b3
  6. 【R语言实验】主成分分析
  7. Linux语法 命令大全
  8. N-Layer, COP, SOA In WOW Addon Develop
  9. 只有做到这三点,你的产品才可能成功
  10. 玩玩大数据:自拍有风险!大数据分析,是什么“出卖”了你?