条形码、二维码、三维码解读


元旦假期无聊做了个 手绘二维码工具,一直以来都只是用,却对其背后的信息不是很了解,恰逢周末,正好来学习记录一下。

1 条形码 Bar code

1.1 释义

条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。

但是光有这些标识,其实是没多大用途的;需要和条形码识别器进行配合,将标识中“包含”的数据读取出来,才能被用于后续的使用。

1.2 识别原理

条码符号是由反射率不同的“条”、“空”按照一定的编码规则组合起来的一种信息符号。由于条码符号中“条”、“空”对光线具有不同的反射率,从而使条码扫描器接受到强弱不同的反射光信号,相应地产生电位高低不同的电脉冲。而条码符号中“条”、“空”的宽度则决定电位高低不同的电脉冲信号的长短。

条形码扫描器利用光电元件将检测到的光信号转换成电信号,再将电信号通过模拟数字转换器转化为数字信号传输到计算机中处理。我们在生活中,最常见到的就是下面这种设备。光笔扫描器

1.3 编码原理

有一篇文章介绍的很全面,这里不再赘述。

1.4 示例:Code128编码

空白+开始位 + [FNC1(为EAN128码时加)] + 数据位 + 检验位 + 结束位+空白
Code128检验位计算:(开始位对应的ID值 + 每位数据在整个数据中的位置×每位数据对应的ID值)% 103

比如我要编码的内容是“TIGER”,则参照码表。

IDCode128ACode128BCode128CBandCode编码值
0SPSP0212222bbsbbssbbss
31??31212321bbsbbsssbbs
37EE37132113bsssbbsbsss
39GG39211313bbsbsssbsss
41II41231311bbsssbsssbs
50RR50231131bbsssbsbbbs
52TT52213311bbsbbbsssbs
101FNC4CODEACODEA311141bbbsbsbbbbs
102FNC1FNC1FNC1411131bbbbsbsbbbs
103StartAStartAStartA211412bbsbssssbss
104StartBStartBStartB211214bbsbssbssss
105StartCStartCStartC211232bbsbssbbbss
106StopStopStop2331112bbsssbbbsbsbb

则按照编码规则后可计算出数据位与校验位((103 + 52 + 241 + 339 + 437 + 550)%103)

开始位StartA(bbsbssssbss)+数据位[T(bbsbbbsssbs) I(bbsssbsssbs) G(bbsbsssbsss) E(bsssbbsbsss) R(bbsssbsbbbs)] + 检验位31(bbsbbsssbbs)+  结束位Stop(bbsssbbbsbsbb)

即:

bbsbssssbssbbsbbbsssbsbbsssbsssbsbbsbsssbsssbsssbbsbsssbbsssbsbbbsbbsbbsssbbsbbsssbbbsbsbb

然后机器用这个字符串按像素排列,生成条形码

# pip install pySrtich
import os
from pystrich.code128 import Code128Encoder
encoder=Code128Encoder('tiger')
encoder.save("./1.png",bar_width=2)
os.system("./1.png")

tiger

详细解读可点击链接

2 二维码 QR code

2.1 释义

二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。

2.2 QR 码基本结构

QR 码基本结构
在这张图中,不难看出:空白区、位置探测图形、矫正图形、定位图形都是固定的。

校正图形:规格确定,校正图形的数量和位置也就确定了;
格式信息:表示改二维码的纠错级别,分为L、M、Q、H;

版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。

数据区和纠错码字,这块才是我们所有信息的几种汇聚地。

详细结构可参考:链接

2.3 码元结构

QR 码版本及规格信息
版本区别

版本 40

可以看出,数据区数据越多,需要的码元空间也就越大,其版本也就越大,我们肉眼能看到的二维码也就越密集。版本最大到 40,也就是说,数据区可存储的数据空间是有限的,超过一定阈值,就无法生成二维码。

寻象图型

2.4 编码规范

第一步,计算出编码数据占据的空间大小,选择最佳版本坑位。
版本坑位

第二步,将数据字符转化成位流。

如需模式转化,则在新的模式段开始前加上模式指示符进行模式转换。在数据序列后面添加终止符。最终位流以8 位进行码字。

在此过程中,需根据修正精度,计算你纠错编码。
按需要将上面的码字序列分块,并根据纠错等级和分块的码字,产生纠错码字,并把纠错码字加入到数据码字序列后面,成为一个新的序列。

第三步,填充数据到指定位置,生成二维码。
序列顺序如:如:D1, D12, D23, D35, D2, D13, D24, D36, … D11, D22, D33, D45, D34, D46, E1, E23,E45, E67, E2, E24, E46, E68,…
版本 2-M 的符号字符布置

示例
数据可以按照一种模式进行编码,以便进行更高效的解码,例如:对数据:01234567编码(版本1-H),
1)分组:012 345 67
2)转成二进制:012→0000001100 (即8+4)
345→0101011001
67 →1000011
3)转成序列:0000001100 0101011001 1000011
4)字符数 转成二进制:8→0000001000
5)加入模式指示符(上图数字)0001:0001 0000001000 0000001100 0101011001 1000011
对于字母、中文、日文等只是分组的方式、模式等内容有所区别。基本方法是一致的

2.5 活码

活码说白了就是二维码内套二维码,外层二维码不会变化,但是经由外部二维码识别到的内容,可以随意更换。

二维码很好用,我自己在公司内有一套专属工具箱(《泰戈尔的工具箱》),里面呢有一系列扫码预览工具,号称“APP 内全场景落地页预览神器”。其就是建立在二维码之上。用的时候绝大多数场景都没啥问题,但是有一些情况下,由于编码跳转链接太过冗长,会导致数据量超出了二维码能承载的上限。

这就导致没办法直接生成二维码去“预览跳转”了。结合市面上常见的“活码”技术,针对这个数据承载量有限的问题,我也有了一套针对性解决方案。

那就是“重定向”(仅支持端内跳转形式的 scheme 来生成二维码)。

比如来看个例子:
本地起一个 web 服务

查看本机 IP 地址

生成二维码“活码”
活码示例

手机与电脑链接至同一台 WiFi 设备下,扫这个码。

可以发现成功 redirect。

我生成的码命名是“http://192.168.0.104:8080/redirect”, 结果扫码后却是"https://blog.csdn.net/marksinoberg"。

这就是“活码”的其中一个应用,目前很好的解决了我在公司内遇到的二维码过长无法生成问题。

不难看出,“活码”可应用的方向多,但受限也比较多,具体场景具体分析吧。

3 三维码 VR code

3.1 释义

三维码, [1] 英文名称VR Code,VR全称Visual Recognition(视觉识别),由创始人陈绳旭 [2] 重新定义标识为“三维码”,并在全球范围内申请相关知识产权保护,其中包括商标。三维码相较于二维码具有更大的信息容量、相同的识别便易性和较好的安全性。其编码方式是先将文本编译一串二进制数字,然后通过特定的算法并结合图片整体的色彩内容,将该二进制数字串与图像信息编码为一组可以通过特定规则解读的阵列。并且该图像阵列除了可以被机器设备读取以外,仅用人眼辨识也可以获取到部分乃至全部文本信息。

3.2 拓展

对三维码我也只是略有耳闻,没有具体了解,有兴趣的可自查,这里不做记录了。

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Windows系统下,我们可以使用Qt C++编程语言来生成条形码二维码。首先,我们需要下载并安装Qt开发环境。 生成条形码可以使用Zint库,它是一个开源的条形码生成库。我们需要先下载和安装Zint库,并将其添加到我们的Qt项目中。 接下来,我们可以在Qt的项目中使用以下代生成条形码: ```cpp #include <iostream> #include <QImage> #include <QPainter> #include <QFile> #include <QTextStream> extern "C" { #include "zint.h" } int main() { int error_number; struct zint_symbol *my_symbol; int input_mode = UNICODE_MODE; // 创建一个Zint符号 my_symbol = ZBarcode_Create(); // 设置要生成条形码类型 my_symbol->symbology = BARCODE_CODE128; // 设置输入数据(条形码内容) QByteArray data = "Hello World"; ZBarcode_Encode_and_Buffer(my_symbol, (unsigned char*)data.data(), 0, 0); // 创建一个QImage对象 QImage img(QSize(my_symbol->bitmap_width, my_symbol->bitmap_height), QImage::Format_RGBA8888); // 使用QPainter绘制条形码 QPainter painter; painter.begin(&img); painter.setCompositionMode(QPainter::CompositionMode_Source); painter.fillRect(img.rect(), Qt::white); painter.setCompositionMode(QPainter::CompositionMode_DestinationOver); painter.drawImage(0, 0, QImage(my_symbol->bitmap, my_symbol->bitmap_width, my_symbol->bitmap_height, QImage::Format_Mono)); // 保存生成条形码图片 img.save("barcode.png"); // 释放Zint符号 ZBarcode_Delete(my_symbol); return 0; } ``` 这样,我们就可以在Qt的项目中生成条形码,并将其保存为barcode.png文件。 而生成二维码可以使用QZXing库,它是一个支持二维码生成和解的Qt库。我们需要先下载并安装QZXing库,并将其添加到我们的Qt项目中。 接下来,我们可以在Qt的项目中使用以下代生成二维码: ```cpp #include <iostream> #include <QImage> #include <QPainter> #include <QFile> #include <QTextStream> #include <QZXing> int main() { // 创建一个QZXing对象 QZXing zxing; // 设置要生成二维码内容 QString data = "Hello World"; // 使用QZXing生成二维码 QImage img = zxing.encode(data); // 保存生成二维码图片 img.save("qrcode.png"); return 0; } ``` 这样,我们就可以在Qt的项目中生成二维码,并将其保存为qrcode.png文件。 通过以上方法,我们可以在Windows下使用Qt C++生成条形码二维码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泰 戈 尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值