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 字典(dict)按键和值排序
Jun 28 Python
python fabric实现远程部署
Jan 05 Python
关于Python中异常(Exception)的汇总
Jan 18 Python
Python中%是什么意思?python中百分号如何使用?
Mar 20 Python
python实现旋转和水平翻转的方法
Oct 25 Python
python使用xlsxwriter实现有向无环图到Excel的转换
Dec 12 Python
python实现kmp算法的实例代码
Apr 03 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
Aug 20 Python
关于Python 中的时间处理包datetime和arrow的方法详解
Mar 19 Python
python 判断一组数据是否符合正态分布
Sep 23 Python
Ubuntu16安装Python3.9的实现步骤
Dec 15 Python
python三子棋游戏
May 04 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字符串过滤,转换函数代码
2012/05/01 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
2015/09/25 PHP
PHP操作mysql数据库分表的方法
2016/06/09 PHP
yii2简单使用less代替css示例
2017/03/10 PHP
php实现映射操作实例详解
2019/10/02 PHP
Yii框架自定义数据库操作组件示例
2019/11/11 PHP
js 巧妙去除数组中的重复项
2010/01/25 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
JavaScript数据类型之基本类型和引用类型的值
2015/04/01 Javascript
Node.js中的process.nextTick使用实例
2015/06/25 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
JavaScript对象引用与赋值实例详解
2017/03/15 Javascript
JavaScript实现类似淘宝的购物车效果
2017/03/16 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
vue axios登录请求拦截器
2018/04/02 Javascript
JS多个表单数据提交下的serialize()应用实例分析
2019/08/27 Javascript
vue实现计步器功能
2019/11/01 Javascript
原生js实现九宫格拖拽换位
2021/01/26 Javascript
python3连接MySQL数据库实例详解
2018/05/24 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
Python中类似于jquery的pyquery库用法分析
2019/12/02 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
2016/11/20 面试题
房地产财务管理制度
2014/02/02 职场文书
借款协议书范本
2014/04/22 职场文书
挂牌仪式策划方案
2014/05/18 职场文书
2014年仓管员工作总结
2014/11/18 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
详解前端任务构建利器Gulp.js使用指南
2021/04/30 Javascript
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers