二维码原理介绍

二维码工作原理
  1. 二维码为什么是黑白相间的?黑色表示二进制的“1”,白色表示二进制的“0”

    “我们之所以对二维码进行扫描能读出那么多信息,就是因为这些信息被编入了二维码之中。”黄海平说,“制作二维码输入的信息可以分成三类,文本信息,比如名片信息;字符信息,比如网址、电话号码;还有图片信息,甚至还可以包括简短的视频。”数据信息是怎么被编入的呢?信息输入后,首先要选择一种信息编码的码制。现在常见的二维码都是以QR码作为编码的码制。QR码是矩阵式二维码,它是在一个矩形空间内,通过黑、白像素在矩阵中的不同分布,来进行编码的。我们知道电脑使用二进制(0和1)数来贮存和处理数据,而在二维码中,用黑白矩形表示二进制数据我们肉眼能看到的黑色表示的是二进制“1”,白色表示二进制的“0”,黑白的排列组合确定了矩阵式二维条码的内容,以便于计算机对二维码符号进行编码和分析。

  2. 2

    QR CODE 介绍:QR(Quick-Response) code是被广泛使用的一种二维码,解码速度快。它可以存储多用类型。如下图时一个qrcode的基本结构,其中:位置探测图形、位置探测图形分隔符、定位图形:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异;校正图形:规格确定,校正图形的数量和位置也就确定了;格式信息:表示改二维码的纠错级别,分为L、M、Q、H;版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。数据和纠错码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)。

    二维码原理介绍
  3. 3

    简要的编码过程:数据分析:确定编码的字符类型,按相应的字符集转换成符号字符; 选择纠错等级,在规格一定的条件下,纠错等级越高其真实数据的容量越小。数据编码:将数据字符转换为位流,每8位一个码字,整体构成一个数据的码字序列。其实知道这个数据码字序列就知道了二维码的数据内容。

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

    二维码原理介绍
    二维码原理介绍
  4. 4

     纠错编码:按需要将上面的码字序列分块,并根据纠错等级和分块的码字,产生纠错码字,并把纠错码字加入到数据码字序列后面,成为一个新的序列。在二维码规格和纠错等级确定的情况下,其实它所能容纳的码字总数和纠错码字数也就确定了,比如:版本10,纠错等级时H时,总共能容纳346个码字,其中224个纠错码字。就是说二维码区域中大约1/3的码字时冗余的。对于这224个纠错码字,它能够纠正112个替代错误(如黑白颠倒)或者224个据读错误(无法读到或者无法译码),这样纠错容量为:112/346=32.4%

    二维码原理介绍
  5. 5

    构造最终数据信息:在规格确定的条件下,将上面产生的序列按次序放如分块中,按规定把数据分块,然后对每一块进行计算,得出相应的纠错码字区块,把纠错码字区块 按顺序构成一个序列,添加到原先的数据码字序列后面。如:D1, D12, D23, D35, D2, D13, D24, D36, ... D11, D22, D33, D45, D34, D46, E1, E23,E45, E67, E2, E24, E46, E68,...构造矩阵:将探测图形、分隔符、定位图形、校正图形和码字模块放入矩阵中。

    二维码原理介绍
  6. 6

    掩摸:将掩摸图形用于符号的编码区域,使得二维码图形中的深色和浅色(黑色和白色)区域能够比率最优的分布。 一个算法,不研究了,有兴趣的同学可以继续。格式和版本信息:生成格式和版本信息放入相应区域内。版本7-40都包含了版本信息,没有版本信息的全为0。二维码上两个位置包含了版本信息,它们是冗余的。版本信息共18位,6X3的矩阵,其中6位时数据为,如版本号8,数据位的信息时 001000,后面的12位是纠错位。至此,二维码的编码流程基本完成了,下面就来实践一下吧,当然不用自己再去编写上面的算法了,使用三方包zxing 就可以了编码:public static void encode(String content, String format, String filePath) {try {Hashtable hints = new Hashtable();//设置编码类型hints.put(EncodeHintType.CHARACTER_SET, DEFAULT_ENCODING);//编码BitMatrix bitMatrix = new QRCodeWriter().encode(content,BarcodeFormat.QR_CODE, DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT,hints);//输出到文件,也可以输出到流File file = new File(filePath);MatrixToImageWriter.writeToFile(bitMatrix, format, file);} catch (IOException e) {e.printStackTrace();} catch (WriterException e1) {e1.printStackTrace();}}解码:    BufferedImage image = ImageIO.read(file);//读取文件LuminanceSource source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));      //解码Result result = new MultiFormatReader().decode(bitmap);String resultStr = result.getText();      System.out.println(resultStr);

二维码是一种二维条码技术,其工作原理是通过在二维空间中排列黑白模块化图案来表示数据。二维码的核心技术包括编码、纠错、定位和扫描识别等过程。 ### 二维码的编码原理 二维码的编码过程涉及将原始数据(如文本、网址、电话号码等)通过特定算法转换为二进制数据,然后按照二维码的结构规则排列在二维矩阵中。编码过程中会使用到 Reed-Solomon 纠错算法,以增强二维码在部分损坏时仍能被正确识别的能力。纠错级别通常分为四个等级(L、M、Q、H),分别对应不同的容错能力,最高可容忍约30%的损坏 [^3]。 ### 二维码的技术构成 二维码的结构通常包括以下几个部分: 1. **定位标识**:三个位于二维码角落的“回”字形图案,用于帮助扫描设备快速识别二维码的位置、大小和角度。 2. **时序图案**:黑白交替的模块,用于辅助确定二维码的坐标和模块数量。 3. **数据区域**:包含实际编码的数据信息和纠错码。 4. **版本信息**:用于标识二维码的版本,决定二维码的尺寸和容量。 5. **格式信息**:包含编码方式和纠错等级等信息。 二维码的容量取决于其版本和纠错等级。例如,一个版本为40的二维码(最大版本)在纠错等级为L时,最多可以存储2953个数字字符或4296个字母数字字符 [^3]。 ### 二维码的生成技术 二维码的生成通常依赖于开源库,如 ZXing(Zebra Crossing),它是一个支持多种编程语言和平台的开源库,能够生成和解析多种类型的二维码和条形码。生成二维码时,开发者可以设置参数如内容、尺寸、纠错等级等。例如,使用 ZXing 生成二维码的 Java 代码如下: ```java import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.client.j2se.MatrixToImageWriter; import java.nio.file.FileSystems; import java.nio.file.Path; import java.util.HashMap; import java.util.Map; public class QRCodeGenerator { public static void main(String[] args) throws Exception { String data = "https://www.example.com"; int width = 300; int height = 300; Map<EncodeHintType, Object> hints = new HashMap<>(); hints.put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H); BitMatrix bitMatrix = new MultiFormatWriter().encode(data, com.google.zxing.BarcodeFormat.QR_CODE, width, height, hints); Path path = FileSystems.getDefault().getPath("qrcode.png"); MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path); } } ``` ### 二维码的扫描识别 扫描二维码的过程通常包括图像采集、图像处理、解码和纠错。移动设备通过摄像头采集二维码图像后,使用图像处理算法检测二维码的定位标识,进而提取数据区域并进行解码。ZXing 等开源库同样支持二维码的扫描和解码功能 [^4]。 ### 二维码的应用场景 二维码广泛应用于多个领域,包括但不限于: - **支付系统**:如二维码支付,用户通过扫描商户生成的二维码完成支付操作 [^2]。 - **登录系统**:用户通过扫描网页上的二维码完成身份验证,实现快速登录 [^1]。 - **营销广告**:商家通过二维码提供产品信息、优惠券链接等 [^3]。 ### 二维码的类型 根据是否支持动态更新,二维码可以分为静态二维码和动态二维码: - **静态二维码**:内容在生成后无法更改,适用于无需更新的场景,如名片、网址链接等 。 - **动态二维码**:内容可由服务器端动态更新,适用于需要统计扫码数据或频繁更新信息的场景 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值