条形码二维码三维码解读

Posted 泰 戈 尔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了条形码二维码三维码解读相关的知识,希望对你有一定的参考价值。

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


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

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")

详细解读可点击链接

2 二维码 QR code

2.1 释义

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

2.2 QR 码基本结构


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

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

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

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

详细结构可参考:链接

2.3 码元结构


可以看出,数据区数据越多,需要的码元空间也就越大,其版本也就越大,我们肉眼能看到的二维码也就越密集。版本最大到 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,…

示例
数据可以按照一种模式进行编码,以便进行更高效的解码,例如:对数据: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 来生成二维码)。

比如来看个例子:

生成二维码“活码”

手机与电脑链接至同一台 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 拓展

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

以上是关于条形码二维码三维码解读的主要内容,如果未能解决你的问题,请参考以下文章

条形码二维码三维码解读

QR 码详解(下)

微信扫码支付与生成二维码

二维码和条形码是啥关系?

ICLR 2023详细解读DreamFusion:用二维diffusion models完成三维生成任务

java-zxing扫描二维码和条形码(一维码)