博客开发记录0x03——微信小程序码插件
小程序二维码的算法没有公开,于是只能自己研究解析算法。这也是我目前编写耗时最久的插件了。🤣
方案简述
微信小程序二维码于2017年面世,长得“犹如一朵盛开的菊花”。其具体生成、解析的算法微信官方没有公开,但是可以直接解析记录具体线条的位置、长度,再以此来还原小程序码。
参考资料
解析步骤
寻找定位点
将图片二值化,沿X轴统计连续的黑/白像素数量,根据长度比例筛选出合适的像素点。
对筛选出来的像素再沿着Y轴、45度再筛一边。最后得到三个定位点。
确定圆心及起始半径
三个定位点呈等腰直角三角形分布,最长边的中点即为圆心。
自直角顶点向圆心遍历,统计每个半径的关键点总数。100%到0%的突变半径即为小程序码线条的起始半径。
解析线条
在72个方向,从起始半径开始,以一定的步长开始采样。统计各方向上定位点的采样数,并以此为该方向的标准长度。最后根据长度比例计算格子数。
解析结果
23;1;1519;1;1277;1;1021;1;8165;1;625;1;763;1;1751;1;7069;1;15;1;7551;1;6677;1;7677;1;7021;1;1057;1;6219;1;157;1;9;1;7;1;31;1;3931;1;1691;1;6899;1;7045;1;1739;1;7895;1;7499;1;15;1;7343;1;1175;1;7787;1;6573;1;6851;1;7119;1;655;1;459;1;
还原
还原结果
因为种种原因,有一些线条的长度偶尔容易出错。不过,小程序码本身有纠错机制,最后的识别效果很好。😁