Python拼接微信好友头像大图的实现方法


Posted in Python onAugust 01, 2018

基于 itchat 库来获取微信好友头像并执行拼接操作,对微信上文字化好友列表数据进行可视化展示。

Python拼接微信好友头像大图的实现方法

获取好友头像

def save_avatar(folder):
 """
 保存微信好友头像
 :param folder: 保存的文件夹
 """
 itchat.auto_login(hotReload=True)
 users = itchat.get_friends() or []
 print('%d friends found.' % len(users))
 if not os.path.exists(folder):
  os.makedirs(folder)
 index = 1
 for i, user in enumerate(users):
  nickname = user.RemarkName
  username = user.UserName
  file_path = os.path.join(folder, '%03d_%s.png' % (i, nickname))
  if not os.path.isfile(file_path): # 不重复下载
   avatar = itchat.get_head_img(username)
   with open(file_path, 'w') as f:
    f.write(avatar)
    print('Download %d: %s' % (index, file_path))
    index += 1

这里只需要传入一个保存头像的文件夹即可,运行 itchat.auto_login(hotReload=True) 后会弹出微信扫码界面让你授权微信登录,以便接下来的好友数据获取。

在图片下载时,我添加了一个防止重复下载的判断,以免多次运行时每次都要重新进行头像的下载。

取出待拼接头像

def get_image_files(folder, filters=None):
 """
 取出待拼接头像
 :param folder: 目标文件夹
 :param filters: 需要过滤的图片
 :return: 头像路径
 """
 filters = filters or []
 filenames = [os.path.join(folder, sub) for sub in os.listdir(folder)
     if sub.endswith('.png') and not filters.__contains__(sub)]
 return filenames

这里单独写个方法是为了把过滤的逻辑封装进来,以便于去掉指定的微信好友的头像(比如纯色的头像在拼接之后的大图看上去很明显,非强迫症可忽略)。

计算拼接的排列

def calculate_align_way(image_num, force_align=False):
 """
 计算图片排版对齐方式
 :param image_num: 图片数量
 :return: (rowls, columns)
 """
 actual_value = image_num ** 0.5
 suggest_value = int(actual_value)
 if actual_value == suggest_value or force_align:
  return suggest_value, suggest_value
 else:
  return suggest_value, suggest_value + 1

因为需要知道最终拼接图片的行列数,所有这里单独定义一个计算方法。算法就是直接对图片总数开根号,取出的结果如果正好是整数,就直接返回该结果。如果不是整数(大多数情况都如此),则根据参数 force_align 来决定是否强制进行正好全部铺满的显示。如果设为 True ,能强制铺满,但会有部分好友未显示完全;反之则是相对的情况。 后面发现拼接图片最后一行有很多黑色空位时,只需要更改该参数为True即可。

拼接

def join_images(image_files, rows, cols, width, height, save_file=None):
 """
 拼接操作
 :param image_files: 待拼接的图片
 :param rows: 行数
 :param cols: 列数
 :param width: 每张小头像的宽度
 :param height: 每张小头像的高度
 :param save_file: 拼接好图片的保存路径
 """
 canvas = np.ones((height * rows, width * cols, 3), np.uint8)
 for row in range(rows):
  for col in range(cols):
   index = row * cols + col
   if index >= len(image_files):
    break
   file_path = image_files[index]
   im = Image.open(file_path)
   im = im.resize((width, height))
   im_data = np.array(im)
   if len(im_data.shape) == 2:
    im_data = np.expand_dims(im_data, -1)
   x = col * width
   y = row * height
   canvas[y: y + height, x: x + width, :] = im_data
 image = Image.fromarray(canvas)
 image.show()
 if save_file:
  image.save(save_file)

拼接图片调用的是科学计算包 numpy 和图片库 PIL ,主要就是对 ndarray 进行操作。

最终将上面的步骤全部串联起来,执行如下主函数,便得到上面的拼接图片。

FOLDER = 'avatars'

if __name__ == '__main__':
 # 保存所有好友头像
 save_avatar(FOLDER)

 # 取到准备拼接的头像
 image_files = get_image_files(FOLDER)

 # 计算拼接的行列
 rows, columns = calculate_align_way(len(image_files), force_align=True)

 # 执行拼接操作
 join_images(image_files, rows, columns, 64, 64, 'result.png')

Github源码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python ljust rjust center输出
Sep 06 Python
浅谈插入排序算法在Python程序中的实现及简单改进
May 04 Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 Python
python实现猜数字小游戏
Mar 24 Python
python实现多层感知器MLP(基于双月数据集)
Jan 18 Python
详解Python做一个名片管理系统
Mar 14 Python
django 做 migrate 时 表已存在的处理方法
Aug 31 Python
Python list与NumPy array 区分详解
Nov 06 Python
通过实例解析python描述符原理作用
Jan 22 Python
将pycharm配置为matlab或者spyder的用法说明
Jun 08 Python
Pytest中skip和skipif的具体使用方法
Jun 30 Python
Python内置的数据类型及使用方法
Apr 13 Python
Python Flask前后端Ajax交互的方法示例
Jul 31 #Python
Python常见内置高效率函数用法示例
Jul 31 #Python
Python使用jsonpath-rw模块处理Json对象操作示例
Jul 31 #Python
flask-socketio实现WebSocket的方法
Jul 31 #Python
深入flask之异步非堵塞实现代码示例
Jul 31 #Python
Django框架使用富文本编辑器Uedit的方法分析
Jul 31 #Python
Windows下python3.6.4安装教程
Jul 31 #Python
You might like
PHP+javascript制作带提示的验证码源码分享
2014/05/28 PHP
PHP速成大法
2015/01/30 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
2016/03/01 PHP
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
js替代copy(示例代码)
2013/11/27 Javascript
js控制iframe的高度/宽度让其自适应内容
2014/04/09 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
jQuery中:only-child选择器用法实例
2015/01/03 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
JS实现图片剪裁并预览效果
2016/08/12 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
python每隔N秒运行指定函数的方法
2015/03/16 Python
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
利用python写个下载teahour音频的小脚本
2017/05/08 Python
python如何修改装饰器中参数
2018/03/20 Python
Django uwsgi Nginx 的生产环境部署详解
2019/02/02 Python
python+Django实现防止SQL注入的办法
2019/10/31 Python
tensorflow 报错unitialized value的解决方法
2020/02/06 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
2021/01/24 Python
Python实现粒子群算法的示例
2021/02/14 Python
linux面试题参考答案(7)
2012/10/29 面试题
会计专业自荐信
2013/12/02 职场文书
护士检查书
2014/01/17 职场文书
母婴店促销方案
2014/03/05 职场文书
保密工作责任书
2014/04/16 职场文书
电力培训心得体会
2014/09/02 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
一百条裙子读书笔记
2015/07/01 职场文书
先进个人主要事迹范文
2015/11/04 职场文书
一些让Python代码简洁的实用技巧总结
2021/08/23 Python