Github被Microsoft收购,Node也要倒过来了Deno… 最近新鲜事儿着实不少。。

背景

知乎上有个问题Python 里itchat 模块能实现什么有趣的东西?

从中看到 wxImage 这个项目。基于Python下大名鼎鼎的itchat实现。

让我想到了Node 下的Wechaty,之前曾用其做消息转发,这次随手拿来玩一玩,此处采用Node来实现好友头像拼接这一效果。

PS: 虽然拼接好友头像后并没什么意义,然而这个想法很有意思,自己玩一玩还是不错的,顺便可以了解下node的生态。

效果展示

  • 先上结果图

  • 再来一波动图

站在巨人的肩膀上

  • 用到的轮子
  1. wechaty
  2. sharp
  3. uuid

通过以上npm 包,可实现这一功能。

目前还是使用wechaty内置浏览器的方式显示、扫描二维码,效果比较直观;也可采用qrcode-terminal,将二维码显示在终端,方便操作。

使用现成的轮子只有一个原因———懒(提高效率),而造轮子的原因则有很多:

  1. 没有现成的,或有可用的,但是不好用;
  2. 很闲;
  3. 享受编码的乐趣;
  4. you name it ……

代码解析

这里通过两种设计方式实现了小图片拼接为大图片:

  • 采用类似于wxImage
    的方式布局最后生成的合成图片,思路:底部背景固定大小,动态计算每个小头像的大小。

Note:由于限定背景大小,同时采用了开方加取整操作,导致因好友数量不同而出现以下问题:

  1. 右侧多出一部分背景;———这可以通过裁减图片解决
  2. 最后一行头像显示不全;———这是设计方式、计算方法的问题(向下取整导致背景不足以容纳所有的头像)
 /* Fixed Total Sizetake advantage of the Mathematics theory: Same areasize  —————————————————|__|n             | | n               | size |                 |      Area: size^2 = n^2 * numberOfImages |                 |            |                 ||                 | —————————————————*/stitchFixedTotalSize: (dir) => {return new Promise((resolve, reject) => {try {// 1. get avatar listdir = dir.endsWith('/') ? dir : dir + '/';let files = fs.readdirSync(dir);files = files.filter((item) => {return fs.statSync(dir + item).size != 0; // remove empty image}).map((item) => {return item = dir + item;})const result = dir + 'friends.jpg';const refined = dir + 'friends-refined.jpg';// 2. compute sizes/* Fixed Total Sizetake advantage of the Mathematics theory: Same areasize  —————————————————|__|n             | | n               | size |                 |      Area: size^2 = n^2 * numberOfImages |                 |            (here, n is eachsize)|                 ||                 | —————————————————*/let eachsize = Math.floor(Math.sqrt((size * size) / (files.length)));let columns = Math.floor(size / eachsize);let x = 0;let y = 0;// 3. prepare for compositeconst options = {raw: {width: size,height: size,channels: 4}};const base = sharp({create: {width: size,height: size,channels: 4,background: { r: 0, g: 0, b: 0, alpha: 128 }}}).raw().toBuffer();// 4. do images compositeconst composite = files.reduce(function (input, overlay) {return input.then(async function (data) {let temp = sharp(data, options).overlayWith(await sharp(overlay).resize(eachsize, eachsize).toBuffer(), { top: eachsize * y, left: eachsize * x }).raw().toBuffer();x += 1;if (x == columns) {x = 0;y += 1;}return temp;});}, base);// data contains the multi-composited image as raw pixel datacomposite.then(function (data) {sharp(data, {raw: {width: size,height: size,channels: 4}}).toFile(result, function (err, output) {if (err) {console.log(err);}console.log(output);// 5. cut, extract a region of the input image, saving in the same format.sharp(result).extract({ left: 0, top: 0, width: eachsize * columns, height: eachsize * columns }).toFile(refined, function (err, output) {if (err) {console.log(err);}console.log(output);resolve('friends-refined.jpg');});});});} catch (err) {reject(err);}})},

后来分析发现,在固定背景图大小的情况下,如果换一种方式,可保证所有头像都被包含进来,即采用向上取整,具体代码见merge.js里的stitchFixedTotalSizeCeil方法。

缺点:合成后的图片可能需要裁减,这是因为限定了背景图大小,不可避免。

  • 采用固定每张小头像的尺寸的方法,这里设为64px,动态计算并设置背景图的宽、高。

相比上一种算法的优点是:动态设置背景图大小,无需再做裁减。代码此处省略,见源码。

merge.js里的方法:

  1. stitchFixedEachSize:每行放的头像数向下取整,下方动态补齐高度
 /* Fixed eachsize: Floorwidth  —————————————————|__|64            | |64               | height |                 |     |                 ||                 ||                 | —————————————————|_________________| */
  1. stitchFixedEachSizeCeil:每行放的头像数向上取整,下方动态减掉高度
/* Fixed eachsize: Ceilwidth  —————————————————|__|64            | |64               | height |                 |     |                 ||                 |-|-----------------|- —————————————————
*/

自由发挥

可以发布一个站点到云服务器,扫一扫后就可以获得拼接后的好友头像。
关于web微信的接口,可玩的有不少,有时候自己就是想不到,这时就要借鉴其他人了,参考上面的知乎链接。

还是那句话:

When you have an idea, make it happen.

Reference

wxImage

Source Code: Microsoft Github


If you have any questions or any bugs are found, please feel free to contact me.

Your comments and suggestions are welcome!

Node.js实现微信好友头像拼接(wechaty+sharp)相关推荐

  1. python获取微信好友头像拼接“2020”

    python获取微信好友头像拼接"2020" 背景 思路 源码说明 背景 2019年的最后一天,心想马上就要跨年,大家都在总结和祝福,但是又不想随大流,打开微信,翻看着通讯录,突然 ...

  2. Python项目:生成微信好友头像拼接图

    import itchat import os import PIL.Image as Image #PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库 ...

  3. 一键拼接微信好友头像/玩炫朋友圈

    在这里提供一键拼接微信好友头像的源码,分享到朋友赚足眼球. 另附打包好的工具,下载即用! import sys from wxpy import * import math from PIL impo ...

  4. Python:通过wxpy拼接所有微信好友头像

    文章目录 简介 代码示例 小结 简介 相信微信大家是用得再多也不过了.那么,对于python+微信,又能玩出什么新的花样呢?下面小编就给大家带来一个好玩的东西.用python下载所有的微信好友的头像, ...

  5. 来!把 5000 微信好友头像拼成一张图!

    作者 | 苏克1900 本文经授权转载自高级农民工(ID:Mocun6) 先PO一张图. 有没有犯密集恐惧症?这并不震撼,如果你有 5000 位好友的话,做出来的图看着会更刺激些. 看完了图,你可能想 ...

  6. Python实现一键生成微信好友头像墙

    效果图: 具体代码实现如下: # -*- coding: utf-8 -*- from wxpy import * import math from PIL import Image import o ...

  7. 用python把微信好友头像拼成一张图

    首先需要用到三个库: wxpy库(用于获取好友头像然后下载). pillow库(用于拼接头像). pyinstaller库(用于打包python程序成exe文件) 这里我说一下创建虚拟环境的步骤: 我 ...

  8. python爬虫好友图片_Python爬取所有微信好友头像,制作微信好友图片墙

    今天咱就试试怎么爬取微信列表中所有好友的头像,并做成一张图片墙,代码不长,60 行就可以搞定. 核心是利用三个库:wxpy 库,用于获取好友头像然后下载 Pillow 库,用于拼接头像 Pyinsta ...

  9. 用python做一个微信好友头像合集

    近日在学习python,在公众号上学到的一个很有意思的小项目,利用python将微信所有好友的头像做成拼图,效果如下. 看完了图,你可能想知道这个图咋做出来的,不会是我闲着无聊把把好友头像一个个保存下 ...

最新文章

  1. 2022-2028年中国车载天线行业市场前瞻与投资战略规划分析报告
  2. xCode 开发快捷键
  3. 【Python学习系列二十一】pandas库基本操作
  4. 兼容浏览器将NodeList对象转换为数组
  5. ANSYS——固定斜度的变截面变截面的定义、自由耦合和变截面的定义
  6. PAT 1074. Reversing Linked List (25)
  7. 《ArcGIS Runtime SDK for Android开发笔记》——问题集:如何解决ArcGIS Runtime SDK for Android中文标注无法显示的问题(转载)...
  8. java 二叉树的高度_最全二叉树:完整详解二叉树的遍历以及完全二叉树等6种二叉树...
  9. Java集合源码学习(4)HashSet
  10. 联想哪款服务器性能,联想深腾7000高性能服务器
  11. 同时调用函数和此函数的返回函数:func()()
  12. winhex数据恢复入门教程
  13. newifi3刷机 php,【超强信号】新路由3newifi3专用超强信号老毛子PADAVAN固件新路由3newifi3超强信号eeprom下载...
  14. 金蝶盘点机金蝶条码管理方案实施金蝶仓库条码管理实现方法
  15. 思维破局:认知水平低,是一个人最致命的短板
  16. 全球消费精品消博会亮相!科蒂、资生堂、欧莱雅、奔富、保乐力加、红牛、雀巢、拜耳、澳佳宝都来了 | 美通社头条...
  17. R语言怎么批量进行fisher检验?
  18. 三相SVPWM逆变器MATLAB仿真实验,三相SVPWM逆变电路MATLAB仿真.doc
  19. 工具篇:TailScale免费实现远程设备互连(无费用方案,亲测,零基础安装),支持手机、Windows或linux系统、NAS
  20. JavaScript 中的事件类型5(读书笔记思维导图)

热门文章

  1. c# excel工作表及cell读取
  2. Linux服务器查看内存使用情况
  3. 分仓软件是什么?怎么分仓?
  4. Eclispe常用快捷键
  5. 人名币符号java代码_java怎么输出货币符号
  6. python批量删除微信好友_python 脚本查看微信把你删除的好友--win系统版
  7. python和c 情侣网名_与故里相对的昵称
  8. 弘辽科技:“高点击率主图”要如何才能做成
  9. vue+elementui 打印表格不显示表格边框线
  10. 高级茶叶并非更有营养