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使用base64模块进行二进制数据编码详解
Jan 11 Python
解决使用PyCharm时无法启动控制台的问题
Jan 19 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
python爬取酷狗音乐排行榜
Feb 20 Python
python使用递归的方式建立二叉树
Jul 03 Python
python实现上传文件到linux指定目录的方法
Jan 03 Python
python numpy数组复制使用实例解析
Jan 10 Python
基于Python3.7.1无法导入Numpy的解决方式
Mar 09 Python
Python基础类继承重写实现原理解析
Apr 03 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
使用Python爬取小姐姐图片(beautifulsoup法)
Feb 11 Python
Keras保存模型并载入模型继续训练的实现
Feb 20 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应用提速面面观
2006/10/09 PHP
一段实用的php验证码函数
2016/05/19 PHP
如何利用PHP实现上传图片功能详解
2020/09/24 PHP
How to Auto Include a Javascript File
2007/02/02 Javascript
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
用JavaScript隐藏控件的方法
2009/09/21 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
jquery判断RadioButtonList和RadioButton中是否有选中项示例
2013/09/29 Javascript
Javascript中call和apply函数的比较和使用实例
2015/02/03 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
jQuery实现的简单拖动层示例
2017/02/22 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
js计时事件实现圆形时钟
2020/03/25 Javascript
[00:56]跨越时空加入战场 全新祈求者身心“失落奇艺侍祭”展示
2019/07/20 DOTA
Python运算符重载用法实例
2015/05/28 Python
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
Python基于xlrd模块操作Excel的方法示例
2018/06/21 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/26 Python
Python提取频域特征知识点浅析
2019/03/04 Python
python3-flask-3将信息写入日志的实操方法
2019/11/12 Python
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
数控个人求职信范文
2014/02/03 职场文书
cf收人广告词
2014/03/14 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书
师范生小学见习总结
2015/06/23 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
redis限流的实际应用
2021/04/24 Redis
如何使用pdb进行Python调试
2021/06/30 Python
win11怎么用快捷键锁屏? windows11锁屏的几种方法
2021/11/21 数码科技
Python使用pyecharts控件绘制图表
2022/06/05 Python
Vue深入理解插槽slot的使用
2022/08/05 Vue.js