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最长公共子串算法实例
Mar 07 Python
Python的__builtin__模块中的一些要点知识
May 02 Python
Go语言基于Socket编写服务器端与客户端通信的实例
Feb 19 Python
Python selenium文件上传方法汇总
Nov 19 Python
Python常用库推荐
Dec 04 Python
Python实现的简单模板引擎功能示例
Sep 02 Python
Numpy数据类型转换astype,dtype的方法
Jun 09 Python
Anaconda2 5.2.0安装使用图文教程
Sep 19 Python
基于python爬取有道翻译过程图解
Mar 31 Python
Python学习工具jupyter notebook安装及用法解析
Oct 23 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
Nov 28 Python
bat批处理之字符串操作的实现
Mar 16 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
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
php绘制圆形的方法
2015/01/24 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
2015/02/12 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
js 多种变量定义(对象直接量,数组直接量和函数直接量)
2010/05/24 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
2020/12/24 Javascript
angularjs中ng-attr的用法详解
2016/12/31 Javascript
javascript防篡改对象实例详解
2017/04/10 Javascript
vue2 前后端分离项目ajax跨域session问题解决方法
2017/04/27 Javascript
BACKBONE.JS 简单入门范例
2017/10/17 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
JS的函数调用栈stack size的计算方法
2018/06/24 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
React实现todolist功能
2020/12/28 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
Python引用模块和查找模块路径
2016/03/17 Python
Python栈算法的实现与简单应用示例
2017/11/01 Python
django-rest-framework解析请求参数过程详解
2019/07/18 Python
详解python中index()、find()方法
2019/08/29 Python
DJANGO-URL反向解析REVERSE实例讲解
2019/10/25 Python
如何利用python读取micaps文件详解
2020/10/18 Python
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
销售工作人员的自我评价分享
2013/11/10 职场文书
国庆宣传标语
2014/06/30 职场文书
综治工作心得体会
2014/09/11 职场文书
财务出纳岗位职责
2015/03/31 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
高中美术教学反思
2016/02/17 职场文书
python的netCDF4批量处理NC格式文件的操作方法
2022/03/21 Python