PS:本文写于5月初,特在 520 当天发表。
前几天看到有人分享了微信头像制作的照片墙,感觉挺有意思的。正好还有半个月就是 520 了,让嫌弃我不够浪漫的老婆也刮目相看一把,于是突发奇想,可不可以将带老婆一起旅行的照片制作成照片墙呢?矩形太普通了,来个心形?520形?
说做就做!度娘了一下心形的矩阵,纸上画出数字 5 2 和心形的排列,逐行计算坐标,试了一下,嗯,完美!
以下我给大家分享一下我的思路(初学 Python,欢迎交流~)
用到的第三方库是 Pillow,觉得这个更适合做简单的图像处理。
- 准备素材,这是最关键的,挑一些拍的美的照片,否则后果很严重(这里一共需要 75 个照片,保险起见,多准备三五张)
- 用自带的 os 库的 os.listdir 方法获取照片所在文件夹下所有文件的 file name,过滤掉非 .jpg 和 .JPG 文件
- 用 PIL 库中的 ExifTags 方法获取图片文件的拍摄日期,然后按日期先后顺序排序,生成过滤后的文件名的列表
- 这个照片墙一共有 8 行 23 列,列出 8 行 23 列 每个 cell 的左上角点的坐标值(x, y),不需要粘贴照片的 cell 的横坐标定位 0,生成所有 cell 坐标值的列表
- 过滤掉所有横坐标为 0 的 cell,得出新的列表,这个列表就是需要粘贴照片的 cell,列表长度为 75
- 接下来裁剪照片,横向和纵向的照片分情况裁剪,对于纵横比例小于 1.1 的做拉伸处理,这样在保证头像完整的前提下变形不会严重。这里有个坑,照片用图像处理工具做了旋转处理后,看着方向对了,但其实 Orientation 值并没有改变,导致粘贴照片后头像方向还是水平的,所以这里做了判断。
另外,由于暂时还没研究人脸识别,所以对于头像不居中的情况采取了执行代码前手动裁剪的笨方法,这个后期学习了 Python人脸识别技术后再来更新。 - 前期准备工作做完了,开始最重要的一步——逐个 cell 粘贴图片。
先创建一个背景图片,我用了稍暗一点的红色做背景。
用 for 循环,在第一个 cell 上粘贴 file name 的 list 中的第一个,也就是日期最早的图片,一直粘贴到最后一张,保存。 - 最后,在做好的图片中底部空白行中添加 2 处文字,一个是一段英文表达爱的美文,一个是水印(虽然很容易被 PS,不过照片具有私人性,别人拿不认识人的照片也没有用,哈哈。)
im.show() 一下,大功告成!
怎么样,是不是很简单?这个礼物发给女友/老婆,一定会收获感动的!亲测哦!!!
来,看一下我的作品!
PhotoWall_520_text.jpg
完整代码如下:
学习之用,转载请注明出处。谢谢!
网友评论