导语
最近接了一个任务,就是将公司部门的员工参与团建活动的照片拼接在一张图片墙上面。为了完成这个任务, 我下载了许多应用,但是基本上只能支持九张照片的拼接,这显然无法满足我的需求。参考了很多网友的帖子,经过不懈努力,最后终于找到一个合适的解决方案——使用 Python + Pillow 实现照片墙。
实例演示
为了方便不熟悉python编程的同学使用,我特意将脚本打包成了可执行程序(exe),下面我先展示该exe文件的使用方式。
1)第一步
首先准备好待拼接的图片,数量尽量多一点,这样拼接之后才有视觉冲击感。我通过爬虫爬取了当当网上的图书照片(下篇文章介绍爬虫),并将其放在了 pictures
文件夹下,照片大概有个近一千张吧,部分如下所示,
2)第二步
运行程序 pictureWallTool.exe
,如下所示,
等待数秒之后,会弹出第一个对话框,让你选择存放图片源的文件夹,我选择了 pictures
文件夹,如下所示,
点击选择文件夹后,会弹出第二个对话框,让你选择保存照片墙的文件名,如下所示,
单击保存,可以看到立即生成了照片墙,如下所示,
3)第三步
最后就是愉快的看生成的结果怎么样啦!下图是用我的图片源生成的照片墙,
怎么样?是不是感觉很高大上!!哈哈。
DEMO 脚本中所使用到的一些 function 有不懂的可百度或谷歌,查看各自的详细描述。脚本在使用时与图片不需要非得放在一起,因为程序运行后会弹出对话框让用户选择,这个对话框会返回一个绝对地址。
不足
- 在代码中我只对图片进行了读取和缩放处理,并没有涉及拉伸、旋转、裁剪等变换,由于我设置待拼接的所有照片都为正方形,因此对于图片尺度比例差距比较大的图片,缩放后会出现变形。为了保证缩放之后的效果,可以利用opencv库添加更多的图片预处理措施。由于工作繁忙,这一块没有继续深入下去。
- 此外,每行的图片数量的选择也很关键。例如 30 张图片可以分为 5×6 排布,31 张照片可以分布为 4×8 排布。最理想状态是脚本自动识别图片个数并合理分配,这块功能暂时没有写入 DEMO 中。
- 最后,图片摆放的位置也可以变化,不一定非要正方形,比如可以摆成心形、圆形等等,以达到更好的视觉效果。这些都没有在程序中实现,有兴趣的朋友可以深入下去,将这个功能做的更加多样性。