如何使用Python实现一个心型照片墙
Admin 2022-08-19 群英技术资讯 560 次浏览
每到一年一度的520等节假日,作为一个地地道道的程序猿心里慌得一批。除了吃饭买礼物看电影好像就没有更多的想法了,于是想想将女友从以前到现在的所有照片整理了一下准备制作一个前所未有的照片墙。
当然,这里我使用的照片是从百度上面拿下来的,私人照片不能公开,哈哈~
没有女朋友的也可以试试,毕竟万一哪天就有了呢!
话不多说,进入正题吧,先将需要的非标准库梳理一下,只有一个PIL图像处理库,另外一个是os的标准库是用来操作文件的。
from PIL import Image import os
然后,定义一个二维数组,这个二维数组是由0和1组成的,观察一下0的位置联合起来就是一个心的形状,之后我们需要按照这个规则将需要的照片放置上去就形成了一个心形的照片墙。
location = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1], [1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1], [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], ]
需要注意的是0的数量其实就是照片的数量,所以尽可能的0的数量是需要小于等于照片的数量,可以根据自己的实际情况进行微调一下也是OK的。
由于我们自己的照片每张的大小可能都是不统一的,所以必须指定一下每张图片放入后的大小。
img_w = img_h = 192 # 宽高都设置为192像素 # 计算location二维数组的行的个数、列的个数 rows = len(location) columns = len(location[0]) # 使用行、列的个数以及每张图片的像素计算出目标画布的大小。 canvas = Image.new("RGB", (img_w*columns, img_h*rows),"white")
我们需要在这个画布上面摆放我们的照片。
下面将我们需要的素材照片拿过来,设置素材图片(女友照片)所在的文件夹。
source_img_dir = r"C:\software\pycharm-workspace\the-public\test008\images" source_imgs = os.listdir(source_img_dir)
没有女朋友照片的也不要灰心,可以去百度上面下载哈,可以看看我之前的文章'百度图片下载2.0'下载很多很多的照片,哈哈哈哈!
接下来就可以来生成我们期待的心形照片墙了,进入收割环节。
# 定义一个下标值,方便从我们的imgs数组里面取出照片。 index = 0 # 通过遍历二维数组中的行、列,从而在相应的位置放上我们的照片。 for row in range(rows): for column in range(columns): # 若是当前二维数组中的元素为1时,表示该位置不在心形需要的位置上故不做处理。 if location[row][column] == 1: continue # 若是当前二维数组中的元素为1时,需要将一张照片放到该位置上 else: try: # 获取一张图片并打开为Image对象 image = Image.open(os.path.join(source_img_dir, source_imgs[index])) # 重新设置当前照片的尺寸大小 image = image.resize((img_w, img_h)) # 将照片image对象,放在画布的特定位置 canvas.paste(image, (img_w * column, img_h * row)) # 递增图片列表中的图片下标 index += 1 except: continue
展示照片墙
canvas.show()
保存照片墙
canvas.save('心形-照片墙.png')
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
多线程概述多线程使得程序内部可以分出多个线程来做多件事情,充分利用CPU空闲时间,提升处理效率。python提供了两个模块来实现多线程threa
这篇文章主要介绍了Python合并Excel表(多sheet)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
这篇文章主要介绍了Python Opencv中基础的知识点,主要包括创建窗口、保存图片、采集视频、鼠标控制的代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
下面就使用VLAD表示图像,实现一个小型的图像数据库的检索程序。下面实现需要的功能模块,分步骤给大家介绍的非常详细,对OpenCV图像数据库检索功能感兴趣的朋友跟随小编一起看看吧
运算符是处理的操作数的值的结构。考虑表达式4 + 5= 9.在这里4和5被称为操作数,而 + 被称为操作符。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008