“山寨版”《草料二维码》

背景

之前浏览过草料二维码的网站,他的二维码美化功能很强大💪,可以分别自定义码眼和码点的形状和颜色!

碰巧之前写过一个 npm 插件 qrcode-with-logos, 用于前端生成带 logo 的二维码。

而且在 github 的 issues 里有外国友人 👨‍🦱 问我能否实现不同样式的二维码,刚好以此作为新需求,模仿草料二维码的样式和功能,开发了 qrcode-with-logos 的 v1.1.0 版本。

有了 qrcode-with-logos 这款 npm 插件,你也可以在你的网站实现不同风格组合的 qrcode 了!

实现功能

  • 自定义码眼码点颜色!
  • 自定义码眼码点形状!
  • 自动计算合适的 logo 大小!
  • 自由选择不同宽高比的 logo, 不再是之前限定的 1:1
  • 自动选择合适的容错率版本!
  • 相比之前版本更快的绘制速度!

demo及文档点击👉这里,实现的效果如下:

实现原理

qrcode 的原理在这里就不过多介绍了,有兴趣的小伙伴可以网上搜索一下。

本插件是基于 qrcode 插件生成的记录二维码点阵的一维数组,从而得知每个点的黑白情况。

import QRCode from 'qrcode'
const QRDATA = QRCode.create(content, nodeQrCodeOptions)

const size = QRDATA.modules.size
const version = QRDATA.version
const qrcodeArray = QRDATA.modules.data

如:9*9 的点阵二维码,其数组长度 81,内容大致为:[1,1,1,1,1,1,1,0,0,0,0,0,....],其中 1 代表黑点,0 代表白点。

/**判断当前坐标是否为黑点 */
function isDark(x: number, y: number) {
  return qrcodeArray[x + y * size] === 1
}

根据此数据我们可以分别绘制码眼码点及 logo。

  • 首先绘制码点,在绘制码点之前,我们需要计算 logo 所占位置的区域,此区域内不绘制码点,(之前是 logo 直接覆盖码点,效果不好),提高绘制速度。

  • 其次绘制码眼,码眼长度固定为 7 * 7, 码眼内部固定为 3*3 的实心矩形,当然也可以自由绘制其他形状。

  • 最后在 logo 区域绘制 logo 及 logo 背景色。

逻辑比较简单,具体代码实现有兴趣的小伙伴请移步 Github!

踩坑过程

  1. 之前版本是支持自定义 logo 的大小的,但是这种过于自由导致二维码的识别效率不高,容易出现识别不出的情况,因此这次版本去掉了自定义 logo 大小的功能,根据 qrcode 的容错率计算 logo 最大能占用的面积大小,用于计算 logo 的最大大小。

  2. 在实现液化码点的时候,圆液化实现效果比较好,但是 fluid-line 实现的效果远不及原版的液化效果,有没有小伙伴有更好的思路可以在评论区或者 Github 讨论一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/751495.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Echarts】散点图 制作 气泡 类型图表

目录 需求主要代码效果展示注 需求 需参照设计图画出对应图表 主要代码 /**** 数据 ****/ this.dataList [...Array(8).keys()].map((item) > {return {ywlxmc: 业务类型 (item 1),sl: item > 4 ? 50 : 70} })/**** 气泡样式 ****/ const styleList [{offset: [56…

13 Redis-- MySQL 和 Redis 的数据一致性

Redis-- MySQL 和 Redis 的数据一致性 先抛一下结论:在满足实时性的条件下,不存在两者完全保存一致的方案,只有最终一致性方案。 不好的方案:先写 MS,再写 Redis 例如 :A请求更新数据为10,B…

第六十九:iview 表格汇总怎么拿到传过来的数据,而不是自动累加,需要自定义方法

话不多少,先看官方解释 我这个简单,所以所有说明都在图上了 handleSummary({ columns, data }){console.log(columns, data)let sums {}columns.forEach((item,index)>{const key item.key;console.log("key",item)if(index 0){console.…

C语言基础笔记(全)

一、数据类型 数据的输入输出 1.数据类型 常量变量 1.1 数据类型 1.2 常量 程序运行中值不发生变化的量,常量又可分为整型、实型(也称浮点型)、字符型和字符串型 1.3 变量 变量代表内存中具有特定属性的存储单元,用来存放数据,即变量的值&a…

SAP 免费退货销售订单类型配置简介

作为一名 SD顾问,必须具备熟悉系统和系统配置,但是之前都是做的PP顾问,现在用户需要新增了一个销售订单类型,所以自己研究销售订单类型的配置,才有了以下的文章,希望对各位学习的同学有所帮助 1、创建销售…

qmt量化交易策略小白学习笔记第52期【qmt编程之商品期货数据】

qmt编程之获取商品期货数据 qmt更加详细的教程方法,会持续慢慢梳理。 也可找寻博主的历史文章,搜索关键词查看解决方案 ! 主力合约生成规则 每个品种只有一个主连合约。主连合约于下一个交易日进行指向切换,切换前主连合约不变…

【Python】已解决:TypeError: a bytes-like object is required, not ‘int’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:TypeError: a bytes-like object is required, not ‘int’ 一、分析问题背景 在使用Python进行文件操作或处理二进制数据时,开发者可能会遇到如下错…

为什么带货主播,他突然就不吃香了?

为什么带货主播他突然就不吃香了?工资骤降50%。 相比 2023 年初主播的平均薪资降了50%,那不管你是头部主播还是腰部主播,全部都降薪了。那尾部主播就更不用说了,有的主播他的时薪已经低到 20 块钱一个小时,还不如大学…

UI(三)布局

文章目录 1、Colum和Row——垂直方向容器和水平方向容器2、ColumnSplit和RowSplit——子组件之间插入一条分割线3、Flex——弹性布局子组件的容器4、Grid和GridItem——网格容器和网格容器单元格5、GridRow和GridCol——栅格容器组件和栅格子组件6、List、ListItem、ListItemGr…

Visual Studio 工具使用 之 即时窗口

即时窗口:是Visual Studio中的一个调试工具,它允许开发人员在调试过程中执行代码并查看结果。开发人员可以在即时窗口中输入和执行表达式、调用方法,并查看变量的值。即时窗口通常用于调试过程中的快速测试和验证代码的正确性。 就是下面的这…

<电力行业> - 《第6课:电力企业》

1 电力行业 电力是个庞大的行业,企业众多,这里重点介绍下行业的巨头。 2 输配电企业(电网) 老百姓最熟悉的电力企业,两大电网公司:国家电网、南方电网,行业内最大的甲方。 3 电力基础设施建…

数据结构与算法笔记:高级篇 - B+树:MySql数据库索引是如何实现的?

概述 作为一名软件开发工程师,你对数据库肯定再熟悉不过了。MySQL 作为主流的数据库存储系统,它在我们的业务开发中,有着举足轻重的地位。在工作中,为了加速数据库中数据的查找速度,我们常用的处理思路是,…

【PromptCC】遥感图像变化字幕的解耦范式

摘要 以往的方法忽略了任务的显著特异性:对于不变和变化的图像对,RSICC难度是不同的,以一种耦合的方式处理未变化和变化的图像对,这通常会导致变化字幕的混淆。论文链接:https://ieeexplore.ieee.org/stamp/stamp.jsp…

深入理解RLHF技术

在《LLM对齐“3H原则”》这篇文章中,我们介绍了LLM与人类对齐的“3H”原则,但是这些对齐标准主要是基于人类认知进行设计的,具有一定的主观性。因此,直接通过优化目标来建模这些对齐标准较为困难。本文将介绍基于人类反馈的强化学…

高考填报志愿,要做到知己知彼兼顾平衡

寒窗苦读,无非就是希望能够考上一所理想的大学,不过自从高考改革以后,高考结束后只是第一阶段,接下来第二阶段应对高考填报志愿也同样重要。 如何选择合适的院校、专业,考生和家长都需要做好充足的准备,在收…

零拷贝技术(zero copy),DMA,mmap,sendfile

在一些高性能的IO场景下我们经常能听到零拷贝技术,这是个不错的话题。 零拷贝指的是内核态与用户态之间的数据拷贝,而这两个区域的数据拷贝只能依靠CPU,但是CPU最重要的作用应该是运算。 一、DMA的由来 在没有DMA之前,磁盘的IO…

武汉星起航:欧洲市场巨擘,亚马逊欧洲站重塑全球电商格局

在全球电商的浩瀚星海中,亚马逊欧洲站如一颗耀眼星辰,其卓越服务、海量用户群及尖端的物流网络熠熠生辉。在英国、德国、法国、意大利和西班牙这五大欧洲经济强国中,亚马逊凭借其无与伦比的市场领导力和消费者信任,稳固地占据了电…

个人网站搭建-步骤(持续更新)

域名申请 域名备案 域名解析 服务器购买 端口转发 Nginx要在Linux上配置Nginx进行接口转发,您可以按照以下步骤进行操作: 安装Nginx(如果尚未安装): 使用包管理工具(如apt, yum, dnf, 或zypper&#x…

PLC数据采集案例

--------天津三石峰科技案例分享 项目介绍 项目背景 本项目为天津某钢铁集团下数字化改造项目,主要解决天津大型钢厂加氢站数字化改造过程中遇到的数据采集需求。项目难点PLC已经在运行了,需要采集里面数据,不修改程序,不影响P…

C++编程(五)单例模式 友元

文章目录 一、单例模式(一)概念(二)实现方式1. 饿汉式2. 懒汉式 二、友元(一)概念(二)友元函数1.概念2.语法格式3. 使用示例访问静态成员变量访问非静态成员变量 (三&…