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 相关文章推荐
pyqt4教程之widget使用示例分享
Mar 07 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
Mar 31 Python
浅谈python多线程和队列管理shell程序
Aug 04 Python
Python设计模式之工厂方法模式实例详解
Jan 18 Python
详解python中init方法和随机数方法
Mar 13 Python
Django的用户模块与权限系统的示例代码
Jul 24 Python
python根据多个文件名批量查找文件
Aug 13 Python
jupyter修改文件名方式(TensorFlow)
Apr 21 Python
python字典key不能是可以是啥类型
Aug 04 Python
python 8种必备的gui库
Aug 27 Python
Python调用REST API接口的几种方式汇总
Oct 19 Python
matplotlib部件之套索Lasso的使用
Feb 24 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
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
php 全局变量范围分析
2009/08/07 PHP
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
详解PHP中strlen和mb_strlen函数的区别
2014/03/07 PHP
PHP图片库imagemagick安装方法
2014/09/23 PHP
PHP中创建图像并绘制文字的例子
2014/11/19 PHP
PHP生成唯一订单号的方法汇总
2015/04/16 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
Redis使用Eval多个键值自增的操作实例
2016/11/04 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
2017/05/05 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
2019/05/09 PHP
JQuery1.6 使用方法三
2011/11/23 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
2011/12/11 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
实现placeholder效果的方案汇总
2015/06/11 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
jQuery时间验证和转换为标准格式的时间格式
2017/03/06 Javascript
js排序与重组的实例讲解
2017/08/28 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python实现Const详解
2015/01/27 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
优秀员工评语
2014/02/10 职场文书
年度考核个人总结
2015/03/06 职场文书
单位提档介绍信
2015/10/22 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书