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

    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

    展开全文
  • 二维码介绍PPT下载,关键词:二维码介绍幻灯片下载,蓝色PPT背景,地球、手机幻灯片背景图片,动态、动画、互联网、网上支付PPT下载,商务PPT模板下载,PPT格式; 二维码介绍PPT下载,关键词:二维码介绍幻灯片下载...
  • QR二维码介绍

    2014-08-09 12:10:51
    QR二维码介绍, 详细介绍了QR码的编码规则
  • 自己总结的二维码识读参数指标, 附22种二维码介绍.Specifications For Popular 2D Bar Codes
  • 二维码介绍PPT下载.rar

    2019-07-16 11:39:17
    二维码介绍PPT下载,关键词:二维码介绍幻灯片下载,蓝色PPT背景,地球、手机幻灯片背景图片,动态、动画、互联网、网上支付PPT下载,商务PPT模板下载,PPT格式;
  • QRCode二维码介绍及常用控件,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。
  • 扫码支付这种新的支付方式,造就二维码满天飞的现象。那么让我们分析一下如何使用 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后台直接生成二维码 ...所以在这里介绍在后来生成二维码的方式。 2、不善于文字描述,直接上代码了。 1 import java.awt.Graphics2D; 2 import java.awt.geom.AffineTransform; 3 import java....

    Java后台直接生成二维码

     

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

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

     

      1 import java.awt.Graphics2D;
      2 import java.awt.geom.AffineTransform;
      3 import java.awt.image.BufferedImage;
      4 import java.io.File;
      5 import java.io.IOException;
      6 import java.io.OutputStream;
      7 import java.util.HashMap;
      8 import java.util.Hashtable;
      9 import java.util.Map;
     10  
     11 import javax.imageio.ImageIO;
     12 import javax.servlet.http.HttpServletResponse;
     13  
     14 import org.slf4j.Logger;
     15 import org.slf4j.LoggerFactory;
     16  
     17 import com.google.zxing.BarcodeFormat;
     18 import com.google.zxing.Binarizer;
     19 import com.google.zxing.BinaryBitmap;
     20 import com.google.zxing.DecodeHintType;
     21 import com.google.zxing.EncodeHintType;
     22 import com.google.zxing.LuminanceSource;
     23 import com.google.zxing.MultiFormatReader;
     24 import com.google.zxing.MultiFormatWriter;
     25 import com.google.zxing.Result;
     26 import com.google.zxing.common.BitMatrix;
     27 import com.google.zxing.common.HybridBinarizer;
     28 import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
     29  
     30 /**
     31  * <p>Title:QRCodeUtil </p>
     32  * <p>Description: 二维码生成工具类</p>
     33  * @author Administrator
     34  * @version 
     35  * @since 
     36  */
     37 public final class QRCodeUtil extends LuminanceSource {
     38  
     39     private static final Logger logger = LoggerFactory.getLogger(QRCodeUtil.class);
     40  
     41     // 二维码颜色
     42     private static final int BLACK = 0xFF000000;
     43     // 二维码颜色
     44     private static final int WHITE = 0xFFFFFFFF;
     45  
     46     private final BufferedImage image;
     47     private final int left;
     48     private final int top;
     49  
     50     public QRCodeUtil(BufferedImage image) {
     51         this(image, 0, 0, image.getWidth(), image.getHeight());
     52     }
     53  
     54     public QRCodeUtil(BufferedImage image, int left, int top, int width, int height) {
     55         super(width, height);
     56         int sourceWidth = image.getWidth();
     57         int sourceHeight = image.getHeight();
     58         if (left + width > sourceWidth || top + height > sourceHeight) {
     59             throw new IllegalArgumentException("Crop rectangle does not fit within image data.");
     60         }
     61         for (int y = top; y < top + height; y++) {
     62             for (int x = left; x < left + width; x++) {
     63                 if ((image.getRGB(x, y) & 0xFF000000) == 0) {
     64                     image.setRGB(x, y, 0xFFFFFFFF); // = white
     65                 }
     66             }
     67         }
     68         this.image = new BufferedImage(sourceWidth, sourceHeight, BufferedImage.TYPE_BYTE_GRAY);
     69         this.image.getGraphics().drawImage(image, 0, 0, null);
     70         this.left = left;
     71         this.top = top;
     72     }
     73  
     74     @Override
     75     public byte[] getRow(int y, byte[] row) {
     76         if (y < 0 || y >= getHeight()) {
     77             throw new IllegalArgumentException("Requested row is outside the image: " + y);
     78         }
     79         int width = getWidth();
     80         if (row == null || row.length < width) {
     81             row = new byte[width];
     82         }
     83         image.getRaster().getDataElements(left, top + y, width, 1, row);
     84         return row;
     85     }
     86  
     87     @Override
     88     public byte[] getMatrix() {
     89         int width = getWidth();
     90         int height = getHeight();
     91         int area = width * height;
     92         byte[] matrix = new byte[area];
     93         image.getRaster().getDataElements(left, top, width, height, matrix);
     94         return matrix;
     95     }
     96  
     97     @Override
     98     public boolean isCropSupported() {
     99         return true;
    100     }
    101  
    102     @Override
    103     public LuminanceSource crop(int left, int top, int width, int height) {
    104         return new QRCodeUtil(image, this.left + left, this.top + top, width, height);
    105     }
    106  
    107     @Override
    108     public boolean isRotateSupported() {
    109         return true;
    110     }
    111  
    112     @Override
    113     public LuminanceSource rotateCounterClockwise() {
    114         int sourceWidth = image.getWidth();
    115         int sourceHeight = image.getHeight();
    116         AffineTransform transform = new AffineTransform(0.0, -1.0, 1.0, 0.0, 0.0, sourceWidth);
    117         BufferedImage rotatedImage = new BufferedImage(sourceHeight, sourceWidth, BufferedImage.TYPE_BYTE_GRAY);
    118         Graphics2D g = rotatedImage.createGraphics();
    119         g.drawImage(image, transform, null);
    120         g.dispose();
    121         int width = getWidth();
    122         return new QRCodeUtil(rotatedImage, top, sourceWidth - (left + width), getHeight(), width);
    123     }
    124  
    125     /**
    126      * @param matrix
    127      * @return
    128      */
    129     private static BufferedImage toBufferedImage(BitMatrix matrix) {
    130         int width = matrix.getWidth();
    131         int height = matrix.getHeight();
    132         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    133         for (int x = 0; x < width; x++) {
    134             for (int y = 0; y < height; y++) {
    135                 image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
    136             }
    137         }
    138         return image;
    139     }
    140  
    141     /**
    142      * 生成二维码图片
    143      * 
    144      * @param matrix
    145      * @param format
    146      * @param file
    147      * @throws IOException
    148      */
    149     public static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {
    150         BufferedImage image = toBufferedImage(matrix);
    151         if (!ImageIO.write(image, format, file)) {
    152             throw new IOException("Could not write an image of format " + format + " to " + file);
    153         }
    154     }
    155  
    156     /**
    157      * 生成二维码图片流
    158      * 
    159      * @param matrix
    160      * @param format
    161      * @param stream
    162      * @throws IOException
    163      */
    164     public static void writeToStream(BitMatrix matrix, String format, OutputStream stream) throws IOException {
    165         BufferedImage image = toBufferedImage(matrix);
    166         if (!ImageIO.write(image, format, stream)) {
    167             throw new IOException("Could not write an image of format " + format);
    168         }
    169     }
    170  
    171     /**
    172      * 根据内容,生成指定宽高、指定格式的二维码图片
    173      *
    174      * @param text   内容
    175      * @param width  宽
    176      * @param height 高
    177      * @param format 图片格式
    178      * @return 生成的二维码图片路径
    179      * @throws Exception
    180      */
    181     private static String generateQRCode(String text, int width, int height, String format, String pathName)
    182             throws Exception {
    183         Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
    184         hints.put(EncodeHintType.CHARACTER_SET, "utf-8");// 指定编码格式
    185         hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);// 指定纠错等级
    186         hints.put(EncodeHintType.MARGIN, 1); // 白边大小,取值范围0~4
    187         BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);
    188         File outputFile = new File(pathName);
    189         writeToFile(bitMatrix, format, outputFile);
    190         return pathName;
    191     }
    192  
    193     /**
    194      * 输出二维码图片流
    195      * 
    196      * @param text 二维码内容
    197      * @param width 二维码宽
    198      * @param height 二维码高
    199      * @param format 图片格式eg: png, jpg, gif
    200      * @param response HttpServletResponse
    201      * @throws Exception
    202      */
    203     public static void generateQRCode(String text, int width, int height, String format, HttpServletResponse response)
    204             throws Exception {
    205         Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
    206         hints.put(EncodeHintType.CHARACTER_SET, "utf-8");// 指定编码格式
    207         hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);// 指定纠错等级
    208         hints.put(EncodeHintType.MARGIN, 1); // 白边大小,取值范围0~4
    209         BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);
    210         writeToStream(bitMatrix, format, response.getOutputStream());
    211     }
    212  
    213     /**
    214      * 解析指定路径下的二维码图片
    215      *
    216      * @param filePath 二维码图片路径
    217      * @return
    218      */
    219     public static String parseQRCode(String filePath) {
    220         String content = "";
    221         try {
    222             File file = new File(filePath);
    223             BufferedImage image = ImageIO.read(file);
    224             LuminanceSource source = new QRCodeUtil(image);
    225             Binarizer binarizer = new HybridBinarizer(source);
    226             BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
    227             Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();
    228             hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
    229             MultiFormatReader formatReader = new MultiFormatReader();
    230             Result result = formatReader.decode(binaryBitmap, hints);
    231  
    232             logger.info("result 为:" + result.toString());
    233             logger.info("resultFormat 为:" + result.getBarcodeFormat());
    234             logger.info("resultText 为:" + result.getText());
    235             // 设置返回值
    236             content = result.getText();
    237         } catch (Exception e) {
    238             logger.error(e.getMessage());
    239         }
    240         return content;
    241     }
    242  
    243     public static void main(String[] args) {
    244         String text = "hello world!"; // 随机生成验证码
    245         System.out.println("随机码: " + text);
    246         int width = 100; // 二维码图片的宽
    247         int height = 100; // 二维码图片的高
    248         String format = "png"; // 二维码图片的格式
    249  
    250         try {
    251             // 生成二维码图片,并返回图片路径
    252             String pathName = generateQRCode(text, width, height, format, "D:/new.png");
    253             System.out.println("生成二维码的图片路径: " + pathName);
    254  
    255             String content = parseQRCode(pathName);
    256             System.out.println("解析出二维码的图片的内容为: " + content);
    257         } catch (Exception e) {
    258             e.printStackTrace();
    259         }
    260     }
    261  
    262 }

    3、需要添加的依赖

    1         <dependency>
    2             <groupId>com.google.zxing</groupId>
    3             <artifactId>core</artifactId>
    4             <version>3.3.0</version>
    5         </dependency>
    6  

     

    转载于:https://www.cnblogs.com/c2013/p/10249972.html

    展开全文
  • 二维码

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

    二维码QRCode

     

    一、二维码介绍

     二维码的应用越来越多,开发中会经常使用,这里主要从二维码的介绍、客户端生成与服务器端生成三个方面讲解二维码。二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。

    二维码是信息的载体,通俗说就像我们使用的U盘,能存储一定量的信息在二维码中。

    二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。

    二、客户端生成二维码

    在客户端生成二维码会降低服务器的运算与存储压力,当然要考虑安全性与兼容性。这里使用一个成熟的jQuery插件完成该功能:

    github:https://github.com/jeromeetienne/jquery-qrcode

    使用方法:

    添加标签作为容器:

    <div id="qrCode"></div>

    添加引用:

    <script src="js/jqQrcode/qrcode.min.js" type="text/javascript" charset="utf-8"></script>

    调用生成方法:

    简单生成

    new QRCode(document.getElementById("qrcode"), "内容");

    生成参数:

    var qrcode = new QRCode(document.getElementById("qrcode"), {
        text: "内容",
        width: 128,
        height: 128,
        colorDark : "#000000",
        colorLight : "#ffffff",
        correctLevel : QRCode.CorrectLevel.H
    });

    参数解释:

    width 256  图像宽度
    height    256    图像高度
    typeNumber    4     
    colorDark    "#000000"    前景色
    colorLight    "#ffffff"    背景色
    correctLevel    QRCode.CorrectLevel.L    容错级别,可设置为:
    QRCode.CorrectLevel.L
    QRCode.CorrectLevel.M
    QRCode.CorrectLevel.Q
    QRCode.CorrectLevel.H

    示例:

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="UTF-8">
            <title></title>
            <style>
                
            </style>
        </head>
    
        <body>
           <input type="text" id="txtCon"/> <input type="button" onclick="getCode();" value="生成"/>
            <h2>生成的二维码</h2>
            <div id="err"></div>
            <script type="text/javascript" src="js/jqQrcode/qrcode.min.js" ></script>
            <script type="text/javascript">
                var err=document.getElementById("err");
                var txtCon=document.getElementById("txtCon");
                var cond=new QRCode(err,{
                    watch:300,
                    height:250,
                    colorLight:"#0A8DDF",
                    correctLevel:QRCode.CorrectLevel.L
                });
                function getCode(){
                    cond.makeCode(txtCon.value);
                }
            </script>
        </body>
    
    </html>

    结果:

     

    转载于:https://www.cnblogs.com/lizewang/p/9183013.html

    展开全文
  • 二维码简单介绍

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

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

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

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

    热门讨论 2011-08-30 13:17:40
    一维码及二维码介绍,了解基本原理和应用场景。
  • 草料二维码功能介绍

    2021-05-07 13:53:00
    1.想知道:草料二维码功能介绍 二.参考 1.草料二维码 https://cli.im/tools 总结:good 三.文件传输小工具:测试时间:20210507 1.运行效果 里面会传递:手机本地/微信 微信:传递不了照片,发现...
  • 二维码简要介绍

    2015-04-02 17:59:27
    1: 其实二维码 就是一种新的信息存储 传递识别的技术,
  • 二维码QRious 介绍

    2018-10-20 21:45:29
    二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统...通过qrious.js可以快速生成各种二维码,你可以控制二维码的尺寸颜色,还可以将生成的二维码进行Base64编码。
  • @[](python生成二维码、动态二维码 和 而二维码解析(20190129)) ...一、二维码介绍 https://zhuanlan.zhihu.com/p/28919332 https://blog.csdn.net/u012005313/article/details/51438326 https://bl...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 83,582
精华内容 33,432
关键字:

二维码介绍