栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

情人节到了,用Python自动生成520照片墙吧~

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

情人节到了,用Python自动生成520照片墙吧~

导语

情人节到了,用Python自动生成520照片墙可好,没有对象的自己看

相关文件

关注微信公众号 Python日志, 公众号内回复‘照片墙’获取。

视频教学

视频教学:哔哩哔哩照片墙制作

开发工具

Python版本:3.6.4
相关模块:
pillow模块;
argparse模块;
google_images_download模块
以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

原理

T_T首先,作为一个单身狗,先上Google图片爬一波女神的美图吧。懒得自己动手写爬虫了,所以直接找了个别人开源的库用了。在终端运行:

pip install google_images_download

然后在终端运行:

googleimagesdownload -k "刘亦菲" -l 50
其中各参数含义为:
-k:Google图片搜索的关键词;
-l:需要下载的图片数量。

效果如下:
然后写个小脚本批量重命名一下(强迫症?):

import os
target_path = 'lyf'
for idx, each in enumerate(os.listdir(target_path)):
  os.rename(os.path.join(target_path, each), os.path.join(target_path, '%s.jpg' % idx))

OK,前期准备算是完成了。现在可以开始设计我们的照片墙了。首先是读取图片并调整图片到固定大小以方便制作照片墙:

'''图片读取'''
def readImage(img_path, target_size=(64, 64)):
  img = Image.open(img_path)
  img = img.resize(target_size)
  return img

然后搞个生成器方便批量读取:

'''图片生成器'''
def yieldImage(target_dir, idx, target_size):
  img_paths = sorted([os.path.join(target_dir, imgname) for imgname in os.listdir(target_dir)])
  idx = (idx + 1) % len(img_paths)
  return readImage(img_paths[idx], target_size), idx

OK,现在我们需要做的就是搞个模板文件,然后通过程序解析模板文件来生成我们想要生成的照片墙。这样每次想要生成新的照片墙只需要制作新的模板文件即可,而不需要再去修改我们的代码文件了。

那么如何制作这个模板文件呢?很简单,所谓照片墙,无非是用python先新建一个空图,然后把我们的图片一张张地贴到空图上的指定位置,例如这样:

那么我们可以人为地定义一个01矩阵,0代表对应位置不放图片,1代表对应位置放图片,然后把这个01矩阵作为模板文件保存即可,例如这样:

解析函数实现如下:

'''解析模板'''
def parseTemplate(template_path):
  template = []
  with open(template_path, 'r') as f:
    for line in f.readlines():
      if line.startswith('#'):
        continue
      template.append(line.strip('n').split(','))
  return template

最后我们就可以愉快地利用模板制作我们的照片墙啦,主函数代码如下:

'''主函数'''
def main(pictures_dir, template_path):
  template = parseTemplate(template_path)
  w = len(template[0])
  h = len(template)
  image_new = Image.new('RGBA', (CELLSIZE*w, CELLSIZE*h))
  img_idx = -1
  for y in range(h):
    for x in range(w):
      if template[y][x] == '1':
        img, img_idx = yieldImage(pictures_dir, img_idx, (CELLSIZE, CELLSIZE))
        image_new.paste(img, (x*CELLSIZE, y*CELLSIZE))
  image_new.show()
  image_new.save('picturewall.png')

效果:

运行格式为:
python wallPicture.py -t 模板路径 -p 存放照片的文件夹

我想大家应该学会了吧!!

源码获取

关注微信公众号 Python日志, 公众号内回复‘照片墙’获取。
还有软件,安装包等等资料可以白嫖的哟!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/739334.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号