精华内容
下载资源
问答
  • 二维码介绍

    2017-09-22 09:51:52
    一、二维码的分类 二维码,从字面上看就是用两个维度(水平方向和垂直方向)来进行数据的编码,条形码只利用了一个维度(水平方向)表示信息,在另一个维度(垂直方向)没有意义,所以二维码比条形码有着更高的数据...

    转自:http://www.cnblogs.com/magicsoar/p/4483032.html

    一、二维码的分类

    二维码,从字面上看就是用两个维度(水平方向和垂直方向)来进行数据的编码,条形码只利用了一个维度(水平方向)表示信息,在另一个维度(垂直方向)没有意义,所以二维码比条形码有着更高的数据存储容量。

    从形成方式上,二维码可以分为两类,

    1、堆叠式二维码:在一维条形码的基础上,将多个条形码堆积在一起进行编码,常见的编码标准有PDF417等

    image

                              图1 PDF417码示例

    2、矩阵式二维码:在一个矩阵空间中通过黑色和白色的方块进行信息的表示,黑色的方块表示1,白色的方块表示0,相应的组合表示了一系列的信息,常见的编码标准有QR 码,汉信码等

     image                  image

           图2 QR码示例                                  图3 汉信码示例

    PDF417由美国研发,在美国地区使用广泛;

    汉信码由中国自主研发,目前已在政府相关领域得到初步的使用;

    QR码由日本研发,目前很多的应用都是用QR码进行编码,译码。

    目前使用最广的是QR码,所以接下来的内容会对QR码进行讲解,下文中提到的二维码,指的就是QR码

    QR码分为40个版本,版本1由21x21个方块组成,每个版本增加4个方块,版本40由177x177个方块组成。每增加一个版本,QR码可储存的信息数量也随之增多。

    版本1的二维码最多可以储存25个字符或41个数字,而版本40的二维码最多可以储存4296个字符或7089个数字

    二、二维码的结构

    一个二维码可以分为两个部分,功能图形和编码区域

    image

                                             图4

    功能图形起到定位的作用

    位置探测图形:由三个黑白相间的大正方形嵌套组成,分别位于二维码左上角、右上角、左下角,目的是为了确定二维码的大小和位置。

    定位图形       :由两条黑白相间的直线组成,便于确定二维码的角度,纠正扭曲。

    校正图形       :仅在版本2以上存在,由三个黑白相间的小正方形嵌套组成,便于确定中心,纠正扭曲。

    数据区记录了具体的数据信息,纠错信息与版本信息。

    数据和纠错码:记录了数据信息和相应的纠错码,纠错码的存在使得当二维码的数据出现允许范围内的错误时,也可以正确解码。

    版本信息       :仅在版本7以上存在,记录具体的版本信息。

    格式信息       :记录使用的掩码和纠错等级。

    此外二维码的外围还留有一圈空白区,主要是为了便于识别而存在。

    三、数据编码与实例

    针对不同的数据,QR码设计了不同的数据编码编码方式,我们可以根据数据的种类选择合适的编码方式进行编码。

    数字编码(Numeric)        :可编码0-9,10个数字,如果需要编码的数字的个数不是3的倍数,最后剩下的1或2位数会被转成4或7bits,其它的每3位数字会根据不同版本被编成 10,12,14bits

    字符编码(Alphanumeric) :可编码0-9,大写的A-Z,以及9个其他的字符(space $ % * + – . / :);

    8位字节模式(8-bit Byte)     :可编码JIS X 0201的8位Latin/Kana字符集

    除此之外,QR还提供了其他的编码方式,每一个编码方式都有其独有的id进行标识,这些标识会记录在数据区的前端,使得解码器可以根据二维码使用的编码方式对数据进行解码

          image

                                      图5   一些编码方式及其标识

    纠错码

    二维码存在4个级别的纠错等级,每个纠错级别可修正的错误与标识见图6,纠错级别越高,可以修正的错误就越多,需要的纠错码的数量也变多,相应的可储存的数据就会减少,版本1的二维码在L级别下可储存25个字符,在H级别下只能储存10个字符。

              image

                                 图6

    下面给一个01234567在版本1下用数字编码(Numeric),选择的纠错级别是M的示例

    第一步,将定位图案放到二维码中

          image

                             图7

    第二步:进行数据编码

    根据图8,版本1下,采用Numeric Mode编码时,每三个数字需要10个bits进行标示

    image

                                                图8

    012 ->0000001100

    345 ->0101011001

    67 ->1000011

    组合起来为

    0000001100 0101011001 1000011

     

    在数据的头尾加上一些标准要求的信息

    数字个数 (8) = 0000001000

    编码格式      =0001

    终止符         =0000

    组合起来为

    0000001100 0101011001 1000011->

    0001 0000001000 0000001100 0101011001 10000110000

     

    按8bit一组重新排列,末尾不足的补零

    0001 0000001000 0000001100 0101011001 1000011 0000->

    00010000 00100000 00001100 01010110 01100001 10000000

     

    不足最大bit的添加补齐码(11101100 00010001),版本1 M下需要128bits

    00010000 00100000 00001100 01010110 01100001

    10000000->

    00010000 00100000 00001100 01010110 01100001

    10000000 11101100 00010001 11101100 00010001

    11101100 00010001 11101100 00010001 11101100

    00010001

    第三步:添加纠错码

    纠错码根据数据利用RS算法来进行计算,篇幅所限,这里就不具体讲解了,最终的结果如下:

    00010000 00100000 00001100 01010110 01100001

    10000000 11101100 00010001 11101100 00010001

    11101100 00010001 11101100 00010001 11101100

    00010001->

    00010000 00100000 00001100 01010110 01100001

    10000000 11101100 00010001 11101100 00010001

    11101100 00010001 11101100 00010001 11101100

    00010001 10100101 00100100 11010100 11000001

    11101101 00110110 11000111 10000111 00101100

    01010101

    第四步:将最终的数据编码按顺序放入二维码中

     image                               image

                          图9                                                                       图10

    从左下角开始,1为黑色,0为白色,按顺序依次填入二维码中

    第五步:添加格式信息和进行掩码运算

    得到的图像还需要对数据区进行掩码运算,掩码运算的目的是让图像中黑色和白色方块分布的更加均匀一些,便于解码

    有以下几种掩码运算,相应的标识和变换方式见图11,二维码的左上角的坐标为(0,0)

             image

                                                   图11

     

        image

                                  图12  坐标系和掩码运算的图案

    这里我们选择标识为011的掩码

    格式信息的组成为                       :纠错标识+掩码标识+BCH纠错码

    所以前面的纠错标识+掩码标识为:00011

    BCH纠错码计算为:

    image

    得到纠错码为                             :011 0101 1001

    格式信息为                                :00011 1101011001

    为了避免选择标识00的纠错类别和标识000的掩码运算,照成格式信息为全0的数字,所得的格式信息还要与101010000010010做异或运算

    000111101011001

    101010000010010   XOR

    101101101001011

    最终的格式信息为                      :101101101001011

    将格式信息放入二维码中       

            image

                              图13

    对加格式信息后的二维码 进行掩码运算

    得到的最终二维码,储存的数据信息是01234567

           image

                          图14

    整个流程见图15

        image
                                          图15


    四、二维码的安全知识

    虽然二维码本身承担的只是一些文本数据,但仍会导致一些安全问题

    1、攻击者将一些恶意网站或者一些恶意代码制作成二维码,用户扫描后,会自动下载一些恶意软件,或跳转到一些虚假网站给使用者造成危害,

    2、二维码内如果包含一些可执行的脚本,便可能导致xss攻击     如 http://www.wooyun.org/bugs/wooyun-2012-09145

    3、如果将一些敏感信息不加密而直接储存在二维码中,便会存在信息泄露的可能,比如11年火车票上的二维码就存在泄露使用者的身份证号码的问题。

    五、总结

    虽然我们在使用二维码的时候只需要用手机一扫即可,但二维码的编码和解码却包含了很多的步骤和很多的知识,此外二维码本身仅仅是数据的承载体,我们在使用时要针对一些敏感信息进行加密处理,防范潜在的攻击方式

     

    参考文献

    二维码的生成细节和原理  http://coolshell.cn/articles/10590.html#jtss-tsina

    QR二维码的攻击与防御   http://drops.wooyun.org/tips/160

    展开全文
  • 自己总结的二维码识读参数指标, 附22种二维码介绍.Specifications For Popular 2D Bar Codes
  • 二维码介绍PPT下载.rar

    2019-07-16 11:39:17
    二维码介绍PPT下载,关键词:二维码介绍幻灯片下载,蓝色PPT背景,地球、手机幻灯片背景图片,动态、动画、互联网、网上支付PPT下载,商务PPT模板下载,PPT格式;
  • 扫码支付这种新的支付方式,造就二维码满天飞的现象。那么让我们分析一下如何使用 Python 来生成二维码图片。 1.二维码 二维码(2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向...

    新时代,人们有新的追求,自然而然会有新发明的诞生。去年,在“一带一路”国际合作高峰论坛举行期间, 20 国青年投票选出中国的“新四大发明”:高铁、扫码支付、共享单车和网购。扫码支付这种新的支付方式,造就二维码满天飞的现象。
    那么让我们分析一下如何使用 Python 来生成二维码图片

    1.二维码介绍

    二维码(2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。它能将数字、英文字母、汉字、日文字母、特殊符号(如空格,%,/ 等)、二进制等信息记录到一个正方形的图片中。

    因此,在转换的过程中,离不开编码压缩方式。在许多种类的二维条码中,常用的码制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等。

    二维码在现实生活中的应用越来与普遍,归于功于 QR code 码制的流行。我们常说的二维码就是它。所以,二维码又被称为 QR code。

    QR code 是一种矩阵式二维条码(又称棋盘式二维条码)。它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。

    2.二维码结构

    我们的目的是要使用 Python 生成 QR 码,那我们需要先了解二维码(QR 码)的结构。根据标准(ISO/IEC 18004),我们可以了解到 QR 码结构如下:
    在这里插入图片描述

    2.1功能图形

    功能图形是不参与编码数据的区域。它包含空白区、位置探测图形、位置探测图形分隔符、定位图形、校正图形五大模块。

    - 空白区
    空白区顾名思义就是要留空白。因此,这里不能有任何图样或标记。这样才能保证 QR 能被识别。
    - 位置探测图形
    这个有点类似中文的“回”字。在 QR 码中有个这样的标识,它分别的左上、右上和左下角。作用是协助扫描软件定位 QR 码并转换坐标系。我们在扫描二维码的时候,不管是竖着扫、横着扫、斜着扫都能识别出内容,主要是它的功劳。
    - 位置探测图形分隔符
    主要作用是区分功能图形和编码区域。
    - 定位图形
    它由黑白间隔的各自各自组成的线条。主要用于指示标识密度和确定坐标系。原因是 QR 码一种有 40 个版本,也就是说有 40 种尺寸。每种二维码的尺寸越大,扫描的距离就越远。
    - 校正图形
    只有 Version 2 及以上的QR码有校正标识。校正标识用于进一步校正坐标系。

    2.2编码区域

    编码区域是数据进行编码存储的区域。它由格式信息、版本信息、数据和纠错码字三部分构成。
    - 格式信息
    所有尺寸的二维码都有该信息。它存放一些格式化数据的信息,例如容错级别、数据掩码,和额外的自身 BCH 容错码。
    - 版本信息
    版本信息是规定二维码的规格。前面讲到 QR 码一共有 40 种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。-- 数据和纠错码
    主要是存储实际数据以及用于纠错码字。

    3.二维码的绘制过程

    二维码的绘制大概过程如下:
    1)在二维码的左上角、左下角、右上角绘制位置探测图形。位置探测图形一定是一个 7x7 的矩阵。
    2)绘制校正图形。校正图形一定是一个 5x5 的矩阵。
    3)绘制两条连接三个位置探测图形定位图形
    4)在上述图片的基础上,继续绘制格式信息
    5)接着绘制版本信息
    6)填充数据码纠错码到二维码图中。
    7)最后是绘制蒙版图案。因为按照上述方式填充内容,可能会出现大面积的空白或黑块的情况,导致扫描识别会十分困难。所以需要对整个图像与蒙版进行蒙版操作(Masking),蒙版操作即为异或 XOR 操作。在这一步,我们可以将数据排列成各种图片。

    4.二维码生成需要的库

    下面推荐两个库:qrcode 和 MyQR。

    - qrcode
    qrcode 运行在 Python 3 版本上,它可以玩出很多花样。例如能生成以下三种二维码图片:普通二维码、带图片的艺术二维码(黑白与彩色)、动态二维码(黑白与彩色)。它比较适合直接用于生成二维码图片的场景。

    安装 qrcode 库可以使用 pip 方式。但是该库依赖 pillow、numpy 和 imageio。因此,我们需要先安装依赖库,再安装 qrcode。
    逐一安装下面几个库。
    pip install pillow
    pip install numpy
    pip install imageio
    pip install myqr

    该库生成带图片的艺术二维码算是一大亮点。具体库的操作请大家自行百度。

    - MyQR
    MyQR是一个能够生成自定义二维码的第三方库,可以根据需要生成普通二维码、带图片的艺术二维码,也可以生成动态二维码。
    安装方法:
    pip install myqr

    5.代码演示

    在编程实现生成二维码时,需要注意尽量不要使用vs code编译器,可以使用jupyter notebook或其他编译器代替。vscode似乎有点bug。

    5.1生成普通二维码

    from MyQR import myqr  #注意大小写
    myqr.run(words="网址链接或者字符串,不支持中文")
    

    在这里插入图片描述

    运行后生成一个名为“qrcode.png”的二维码图片,用微信扫一扫生成的二维码,就会自动跳转到这个地址。

    5.2生成带图片的二维码

    此为彩色图片代码,需要黑白图片就去掉参数colorized=True。代码如下:

    from MyQR import myqr
    myqr.run(
        words='https://blog.csdn.net/didi_ya',
        # 扫描二维码后,显示的内容,或是跳转的链接
        version=5,  # 设置容错率
        level='H',  # 控制纠错水平,范围是L、M、Q、H,从左到右依次升高
        picture='D:\\Desktop\\cy.jpg',  # 图片所在目录,可以是动图
        colorized=True,  # 黑白(False)还是彩色(True)
    )
    

    输出结果:
    在这里插入图片描述

    5.3生成带动图的二维码

    将图片位置改成动图即可,代码如下:

    from MyQR import myqr
    myqr.run(
        words='https://blog.csdn.net/didi_ya',
        # 扫描二维码后,显示的内容,或是跳转的链接
        version=5,  # 设置容错率
        level='H',  # 控制纠错水平,范围是L、M、Q、H,从左到右依次升高
        picture='D:\\Desktop\\cy.gif',  # 图片所在目录,可以是动图
        colorized=True,  # 黑白(False)还是彩色(True)
    )
    

    输出结果:
    在这里插入图片描述

    5.4生成可以输入汉字的二维码

    代码如下:

    import qrcode
    from PIL import Image#保存文件是用到
    #  version是二维码的尺寸,数字大小决定二维码的密度
    #  error_correction:指误差
    #  box_size:参数用来控制二维码的每个单元(box)格有多少像素点
    #  border: 参数用控制每条边有多少个单元格(默认值是4,这是规格的最小值
    
    qr = qrcode.QRCode(version=5,
                              error_correction=qrcode.constants.ERROR_CORRECT_L,
                              box_size=8,
                              border=4,
                              )
    # 添加数据
    qr.add_data('你好')
    # 生成二维码
    qr.make(fit=True)
    img = qr.make_image()
    img.save('C:\\Users\\91291\\Documents\\cy1_qrcode.png')
    img.show()
    

    输出:
    在这里插入图片描述
    ok,以上便是全部内容了。

    如果嫌麻烦,直接可以百度搜索二维码生成器,简单方便。
    在这里插入图片描述

    展开全文
  • Java后台直接生成二维码介绍

    万次阅读 2017-12-19 11:45:17
    Java后台直接生成二维码 ...所以在这里介绍在后来生成二维码的方式。 2、不善于文字描述,直接上代码了。 import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.Bu

    Java后台直接生成二维码


    1、其实jquery也可以直接生成二维码的,但我测试的时候,二维码生成后太模糊,难以识别。所以在这里介绍在后来生成二维码的方式。

    2、不善于文字描述,直接上代码了。


    import java.awt.Graphics2D;
    import java.awt.geom.AffineTransform;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.HashMap;
    import java.util.Hashtable;
    import java.util.Map;
    
    import javax.imageio.ImageIO;
    import javax.servlet.http.HttpServletResponse;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.Binarizer;
    import com.google.zxing.BinaryBitmap;
    import com.google.zxing.DecodeHintType;
    import com.google.zxing.EncodeHintType;
    import com.google.zxing.LuminanceSource;
    import com.google.zxing.MultiFormatReader;
    import com.google.zxing.MultiFormatWriter;
    import com.google.zxing.Result;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.common.HybridBinarizer;
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    
    /**
     * <p>Title:QRCodeUtil </p>
     * <p>Description: 二维码生成工具类</p>
     * @author Administrator
     * @version 
     * @since 
     */
    public final class QRCodeUtil extends LuminanceSource {
    
        private static final Logger logger = LoggerFactory.getLogger(QRCodeUtil.class);
    
        // 二维码颜色
        private static final int BLACK = 0xFF000000;
        // 二维码颜色
        private static final int WHITE = 0xFFFFFFFF;
    
        private final BufferedImage image;
        private final int left;
        private final int top;
    
        public QRCodeUtil(BufferedImage image) {
            this(image, 0, 0, image.getWidth(), image.getHeight());
        }
    
        public QRCodeUtil(BufferedImage image, int left, int top, int width, int height) {
            super(width, height);
            int sourceWidth = image.getWidth();
            int sourceHeight = image.getHeight();
            if (left + width > sourceWidth || top + height > sourceHeight) {
                throw new IllegalArgumentException("Crop rectangle does not fit within image data.");
            }
            for (int y = top; y < top + height; y++) {
                for (int x = left; x < left + width; x++) {
                    if ((image.getRGB(x, y) & 0xFF000000) == 0) {
                        image.setRGB(x, y, 0xFFFFFFFF); // = white
                    }
                }
            }
            this.image = new BufferedImage(sourceWidth, sourceHeight, BufferedImage.TYPE_BYTE_GRAY);
            this.image.getGraphics().drawImage(image, 0, 0, null);
            this.left = left;
            this.top = top;
        }
    
        @Override
        public byte[] getRow(int y, byte[] row) {
            if (y < 0 || y >= getHeight()) {
                throw new IllegalArgumentException("Requested row is outside the image: " + y);
            }
            int width = getWidth();
            if (row == null || row.length < width) {
                row = new byte[width];
            }
            image.getRaster().getDataElements(left, top + y, width, 1, row);
            return row;
        }
    
        @Override
        public byte[] getMatrix() {
            int width = getWidth();
            int height = getHeight();
            int area = width * height;
            byte[] matrix = new byte[area];
            image.getRaster().getDataElements(left, top, width, height, matrix);
            return matrix;
        }
    
        @Override
        public boolean isCropSupported() {
            return true;
        }
    
        @Override
        public LuminanceSource crop(int left, int top, int width, int height) {
            return new QRCodeUtil(image, this.left + left, this.top + top, width, height);
        }
    
        @Override
        public boolean isRotateSupported() {
            return true;
        }
    
        @Override
        public LuminanceSource rotateCounterClockwise() {
            int sourceWidth = image.getWidth();
            int sourceHeight = image.getHeight();
            AffineTransform transform = new AffineTransform(0.0, -1.0, 1.0, 0.0, 0.0, sourceWidth);
            BufferedImage rotatedImage = new BufferedImage(sourceHeight, sourceWidth, BufferedImage.TYPE_BYTE_GRAY);
            Graphics2D g = rotatedImage.createGraphics();
            g.drawImage(image, transform, null);
            g.dispose();
            int width = getWidth();
            return new QRCodeUtil(rotatedImage, top, sourceWidth - (left + width), getHeight(), width);
        }
    
        /**
         * @param matrix
         * @return
         */
        private static BufferedImage toBufferedImage(BitMatrix matrix) {
            int width = matrix.getWidth();
            int height = matrix.getHeight();
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
                }
            }
            return image;
        }
    
        /**
         * 生成二维码图片
         * 
         * @param matrix
         * @param format
         * @param file
         * @throws IOException
         */
        public static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {
            BufferedImage image = toBufferedImage(matrix);
            if (!ImageIO.write(image, format, file)) {
                throw new IOException("Could not write an image of format " + format + " to " + file);
            }
        }
    
        /**
         * 生成二维码图片流
         * 
         * @param matrix
         * @param format
         * @param stream
         * @throws IOException
         */
        public static void writeToStream(BitMatrix matrix, String format, OutputStream stream) throws IOException {
            BufferedImage image = toBufferedImage(matrix);
            if (!ImageIO.write(image, format, stream)) {
                throw new IOException("Could not write an image of format " + format);
            }
        }
    
        /**
         * 根据内容,生成指定宽高、指定格式的二维码图片
         *
         * @param text   内容
         * @param width  宽
         * @param height 高
         * @param format 图片格式
         * @return 生成的二维码图片路径
         * @throws Exception
         */
        private static String generateQRCode(String text, int width, int height, String format, String pathName)
                throws Exception {
            Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");// 指定编码格式
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);// 指定纠错等级
            hints.put(EncodeHintType.MARGIN, 1); // 白边大小,取值范围0~4
            BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);
            File outputFile = new File(pathName);
            writeToFile(bitMatrix, format, outputFile);
            return pathName;
        }
    
        /**
         * 输出二维码图片流
         * 
         * @param text 二维码内容
         * @param width 二维码宽
         * @param height 二维码高
         * @param format 图片格式eg: png, jpg, gif
         * @param response HttpServletResponse
         * @throws Exception
         */
        public static void generateQRCode(String text, int width, int height, String format, HttpServletResponse response)
                throws Exception {
            Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");// 指定编码格式
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);// 指定纠错等级
            hints.put(EncodeHintType.MARGIN, 1); // 白边大小,取值范围0~4
            BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);
            writeToStream(bitMatrix, format, response.getOutputStream());
        }
    
        /**
         * 解析指定路径下的二维码图片
         *
         * @param filePath 二维码图片路径
         * @return
         */
        public static String parseQRCode(String filePath) {
            String content = "";
            try {
                File file = new File(filePath);
                BufferedImage image = ImageIO.read(file);
                LuminanceSource source = new QRCodeUtil(image);
                Binarizer binarizer = new HybridBinarizer(source);
                BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
                Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();
                hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
                MultiFormatReader formatReader = new MultiFormatReader();
                Result result = formatReader.decode(binaryBitmap, hints);
    
                logger.info("result 为:" + result.toString());
                logger.info("resultFormat 为:" + result.getBarcodeFormat());
                logger.info("resultText 为:" + result.getText());
                // 设置返回值
                content = result.getText();
            } catch (Exception e) {
                logger.error(e.getMessage());
            }
            return content;
        }
    
        public static void main(String[] args) {
            String text = "hello world!"; // 随机生成验证码
            System.out.println("随机码: " + text);
            int width = 100; // 二维码图片的宽
            int height = 100; // 二维码图片的高
            String format = "png"; // 二维码图片的格式
    
            try {
                // 生成二维码图片,并返回图片路径
                String pathName = generateQRCode(text, width, height, format, "D:/new.png");
                System.out.println("生成二维码的图片路径: " + pathName);
    
                String content = parseQRCode(pathName);
                System.out.println("解析出二维码的图片的内容为: " + content);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }


    		<dependency>
    			<groupId>com.google.zxing</groupId>
    			<artifactId>core</artifactId>
    			<version>3.3.0</version>
    		</dependency>
    
    





    展开全文
  • QR Code码是由日本Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。 QR Code码符号的基本特性 ...

    什么是QR Code码?

    QR Code码是由日本Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。

    QR Code码符号的基本特性

    符号规格 21×21模块(版本1)-177×177 模块(版本40)
    (每一规格:每边增加4个模块)
    数据类型与容量 · 数字数据 :7,089个字符
      · 字母数据 :4,296个字符
    (指最大规格符号版本40-L级) · 8位字节数据 :2,953个字符
      · 中国汉字、日本汉字数据 :1,817个字符
    数据表示方法 深色模块表示二进制“1”,浅色模块表示二进制“0”。
    纠错能力 · L级:约可纠错7%的数据码字
    · M级:约可纠错15%的数据码字
    · Q级:约可纠错25%的数据码字
    · H级:约可纠错30%的数据码字
    结构链接(可选) 可用1-16个QR Code码符号表示一组信息
    掩模(固有) 可以使符号中深色与浅色模块的比例接近1:1,使因相邻模块的排列造成译码困难的可能性降为最小。
    扩充解释(可选) 这种方式使符号可以表示缺省字符集以外的数据(如阿拉伯字符、古斯拉夫字符、希腊字母等),以及其他解释(如用一定的压缩方式表示的数据)或者对行业特点的需要进行编码。
    独立定位功能

     

    QRCODE二维码版本展示

    QR码符号共有40种规格,分别为版本1、版本2„„版本40。版本1的规格为21模块×21模块,版本2为25模块×25模块,以此类推,每一版 本符号比前一版本每边增加4个模块,直到版本40,规格为177模块×177模块。其中最高版本40可容纳多达1850个大写字母或2710个数字或 1108个字节,或500多个汉字,比普通条码信息容量约高几十倍。由于其高密度编码,信息容量大,所以被广泛采用。

    下图1为版本2的示意图(共25模块×25模块):


     

    图1

    如果你使用智能手机二维码拍拍,上图就是一个网址的链接“http://www.lgms.net”。访问它,就可以直接进入一个网站。

    这起到了一个什么作用呢?连接物理世界与虚拟世界的桥梁。所以,有人将它比喻为“物联网的传感器”。这不是我们的重点,不再赘述。下面说说二维码的结构。

    先看下图2:

     

    图2

     

    图3   QRCODE 版本1和2的结构示意图

     

    图4   图1的彩色化版本

     

    图5

    常见QRCODE二维码控件推荐

    目前用于程序开发的条码产品主要分为条码字体及条码控件两大类,条码字体可以非常方便的作为一种特殊的字体在应用程序或OFFICE中输出,而条码控件主要用于嵌入到软件中,客户端浏览不需要字体支持。

    这里向大家推荐2款功能强大的二维码控件。它们分别是 LEADTOOLS 2D Barcode SDK Module 和 Complete Barcode Package 条码控件。

    LEADTOOLS 2D Barcode SDK Module是市场上最全面的条形码工具包,它支持100多种条形码的读写,其中包括所有主要的1D和2D条形码。并且它包含许多有源代码的演示项目,这些源代码包含C, Visual C++ (MFC), VB.NET 和C#的版本。

     DAutomation QR Code Barcode Font and Encoder是一个组件集合,可以使用字体和图形生成QR-Code条形码符号。QR-Code是一种二维(2D)矩阵类型的条形码符号集,它与Data Matrix和Aztec相似,都具有编码大数据量的能力。

    转载于:https://www.cnblogs.com/ywcz060/p/4168777.html

    展开全文
  • 很多开发者把苹果APP上架成功后,想获取下载链接或者制作个二维码让用户可以方便的下载。 可以通过一个网站去搜索获取 1、打开七麦数据平台,输入你的app名称搜索 APP上架成功后48小时内同步,如果还搜索不...
  • QR Code码是由日本Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。 QR Code码符号的基本特性 ...
  • QR Code码是由日本Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。 QR Code码符号的基本特性 ...
  • 二维码

    2018-06-14 14:58:00
    一、二维码介绍 二、客户端生成二维码 三、服务器生成二维码 四、示例下载 五、视频 一、二维码介绍 二维码的应用越来越多,开发中会经常使用,这里主要从二维码的介绍、客户端生成与服务器端生成三个方面...
  • 二维码简单介绍

    2019-08-15 12:17:10
    简单介绍二维码二维码其实就是一种编码技术,只是这种编码技术是用在图片上了,将给定的一些文字,数字转换为一张经过特定编码的图片,而解析二维码则相反,就是将一张经过编码的图片解析为数字或者文字。...
  • 二维码介绍

    2017-10-03 10:19:06
    1.介绍: 某种特定的几何图形按照一定规律在平面图分布的黑白相间的图形记录符号信息的图形,黑点代表的是1 白点代表的是0 2.分类: 线性堆叠式二维码 PDF417、U1tracode、Code49、Code 16K 矩阵式二维码 Data...
  • 二维码介绍

    2016-10-08 11:23:48
    二维码介绍 二维条码/二维码是用某种特定的几何图形按一定规律在平面分布的黑白相间的图形记录数据符号信息的 总结: 用图形记录标记一些信息,方便通过图形识别来获取信息 应用场景 信息...
  • 二维码原理介绍

    千次阅读 2016-04-08 20:16:49
    二维码为什么是黑白相间的?黑色表示二进制的“1”,白色表示二进制的“0” “我们之所以对二维码进行扫描能读出那么多信息,就是因为这些信息被编入了二维码之中。”黄海平说,“制作二维码输入的信息可以分成三...
  • 二维码知识介绍

    2015-05-06 20:12:00
    一、二维码的分类 二维码,从字面上看就是用两个维度(水平方向和垂直方向)来进行数据的编码,条形码只利用了一个维度(水平方向)表示信息,在另一个维度(垂直方向)没有意义,所以二维码比条形码有着更高的数据...
  • 二维码简要介绍

    2015-04-02 17:59:27
    1: 其实二维码 就是一种新的信息存储 传递识别的技术,
  • @[](python生成二维码、动态二维码 和 而二维码解析(20190129)) ...一、二维码介绍 https://zhuanlan.zhihu.com/p/28919332 https://blog.csdn.net/u012005313/article/details/51438326 https://bl...
  • google啥的,发现很多朋友都有介绍二维码扫描的功能,然后我就跟着人家的介绍自己搞起了二维码扫描功能,跟着人家的帖子,很快我的项目就加入了扫描二维码的功能,然后自己还很开心。 随着微信的到来,二维码...
  • 1、基本环境: windows10+python3.6 ...3、二维码种类介绍: 3.1静态二维码---扫描二维码获取内容 from MyQR import myqr ver,level,qr_name = myqr.run(words="python is father") print(ver,level,qr...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,323
精华内容 2,129
关键字:

二维码介绍