zoukankan      html  css  js  c++  java
  • Java 生成二维码

    二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的图形。

    二维条码也有许多不同的码制,码制的编码原理而言,通常分为三种类型

    • 线性堆叠式二维码
    • 矩阵式二维码
    • 邮政码

    线性堆叠式二维码

    编码原理:建立在一维条码基础之上,按需要堆积成两行或多行。

    矩阵式二维码

    在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”

    邮政码

    邮政码通过不同长度的条进行编码,主要用于邮件编码,如:POSTNET、BPO 4-STATE。

    二维码的优缺点

    优点

    • 高密度编码,信息容量大
    • 编码范围广
    • 容错能力强
    • 译码可靠性高
    • 可引入加密措施
    • 成本低,易制作,持久耐用

    缺点

    • 二维码技术成为手机病毒、钓鱼网站传播的新渠道
    • 信息泄露

    目前流行的三大国际标准:

    • PDF417:不支持中文
    • DM:专利未公开,需支付专利费用
    • QR code:专利公开,支持中文

    QR code 比其他二维码相比,具有识读速度快、数据密度大、占用空间小的优势。

    QR code 是由日本Denso公司于1994年研制的一种矩阵二维码符号码,全称是 Quick Response Code。

    纠错能力

    • L级:约可纠错7%的数据码字
    • M级:约可纠错15%的数据码字
    • Q级:约可纠错25%的数据码字
    • H级:约可纠错30%的数据码字

    JSP生成二维码方法

    • 借助第三方jar,如zxing和qrcodejar
    • Javascript,如jquery.qrcode.js

    使用zxing生成二维码

    GitHub地址,猛戳:https://github.com/zxing/zxing

    API文档,猛戳:https://zxing.github.io/zxing/apidocs/index.html

    介绍文档,猛戳:https://zxing.github.io/zxing/

    第一步:引入jar包

    可以通过下载源码自己编译生成jar包,也可以通过maven依赖

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

    第二步:生成二维码的代码 

    package com.jwen.imooc.zxing;
    
    import java.io.File;
    import java.nio.file.Path;
    import java.util.HashMap;
    
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.EncodeHintType;
    import com.google.zxing.MultiFormatWriter;
    import com.google.zxing.client.j2se.MatrixToImageWriter;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    
    public class CreateQRCode {
    
        public static void main(String[] args) {
            int width = 300;
            int height = 300;
            String format = "png";
            String contents = "www.baidu.com";
            
            // 定义二维码的参数
            HashMap hints = new HashMap();
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
            hints.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.M);
            hints.put(EncodeHintType.MARGIN,2);
            
            
            try {
                BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, hints);
            
                Path path = new File("C:/Users/jwen/Desktop/img.png").toPath();
                
                MatrixToImageWriter.writeToPath(bitMatrix, format, path);
            
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    }

    第三步:读取二维码的代码

    public class ReadQRCode {
    
        public static void main(String[] args) {
            try {
                MultiFormatReader formatReader = new MultiFormatReader();
    
                File file = new File("C:/Users/jwen/Desktop/img.png");
    
                BufferedImage image = ImageIO.read(file);
    
                BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
    
                // 定义二维码的参数
                HashMap hints = new HashMap();
                hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    
                Result result = formatReader.decode(binaryBitmap, hints);
    
                System.out.println("解析结果" + result.toString());
                System.out.println("二维码格式类型" + result.getBarcodeFormat());
                System.out.println("二维码文本内容" + result.getText());
    
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    使用qrcode生成二维码

    生成:http://www.swetake.com/qrcode/index-e.html

    读取:https://osdn.jp/projects/qrcode/

    第一步:下载引入jar包

     

     

    第二步:生成二维码的代码 

    package com.jwen.imooc.qrcode;
    
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    
    import javax.imageio.ImageIO;
    
    import com.swetake.util.Qrcode;
    
    public class CreateQRCode {
        public static void main(String[] args) throws Exception {
            int version = 7;
    
            Qrcode x = new Qrcode();
            x.setQrcodeErrorCorrect('M');// 纠错等级
            x.setQrcodeEncodeMode('B');// N代表数字,A代表a-Z,B代表其他字符
            x.setQrcodeVersion(version);// 版本
            String qrDate = "www.baidu.com";
    
            int width = 67 + 12 + (version - 1);
            int height = 67 + 12 + (version - 1);
            File file = new File("C:/Users/jwen/Desktop/img2.png");
    
            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    
            Graphics2D gs = bufferedImage.createGraphics();
            gs.setBackground(Color.WHITE);
            gs.setColor(Color.BLACK);
            gs.clearRect(0, 0, width, height);
    
            int pixoff = 2;// 偏移量
    
            byte[] d = qrDate.getBytes("gb2312");
            if (d.length > 0 && d.length < 120) {
                boolean[][] s = x.calQrcode(d);
    
                for (int i = 0; i < s.length; i++) {
                    for (int j = 0; j < s.length; j++) {
                        if (s[j][i]) {
                            gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
                        }
                    }
                }
            }
    
            gs.dispose();
            bufferedImage.flush();
    
            ImageIO.write(bufferedImage, "png", file);
        }
    }

    第三步:读取二维码的代码

    package com.jwen.imooc.qrcode;
    
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    
    import javax.imageio.ImageIO;
    
    import com.swetake.util.Qrcode;
    
    public class CreateQRCode {
        public static void main(String[] args) throws Exception {
            int version = 7;
    
            Qrcode x = new Qrcode();
            x.setQrcodeErrorCorrect('M');// 纠错等级
            x.setQrcodeEncodeMode('B');// N代表数字,A代表a-Z,B代表其他字符
            x.setQrcodeVersion(version);// 版本
            String qrDate = "www.baidu.com";
    
            int width = 67 + 12 + (version - 1);
            int height = 67 + 12 + (version - 1);
            File file = new File("C:/Users/jwen/Desktop/img2.png");
    
            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    
            Graphics2D gs = bufferedImage.createGraphics();
            gs.setBackground(Color.WHITE);
            gs.setColor(Color.BLACK);
            gs.clearRect(0, 0, width, height);
    
            int pixoff = 2;// 偏移量
    
            byte[] d = qrDate.getBytes("gb2312");
            if (d.length > 0 && d.length < 120) {
                boolean[][] s = x.calQrcode(d);
    
                for (int i = 0; i < s.length; i++) {
                    for (int j = 0; j < s.length; j++) {
                        if (s[j][i]) {
                            gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
                        }
                    }
    
                }
            }
    
            gs.dispose();
            bufferedImage.flush();
    
            ImageIO.write(bufferedImage, "png", file);
    
        }
    
    }
    package com.jwen.imooc.qrcode;
    
    import java.awt.image.BufferedImage;
    
    import jp.sourceforge.qrcode.data.QRCodeImage;
    
    public class MyQRCodeImage implements QRCodeImage {
    
        BufferedImage bufferedImage;
    
        public MyQRCodeImage(BufferedImage bufferedImage) {
            this.bufferedImage = bufferedImage;
        }
    
        @Override
        public int getHeight() {
            return bufferedImage.getHeight();
        }
    
        @Override
        public int getPixel(int arg0, int arg1) {
            return bufferedImage.getRGB(arg0, arg1);
        }
    
        @Override
        public int getWidth() {
            return bufferedImage.getWidth();
        }
    
    }

    注意:此方式本人解析时报错,尚未解决:Invalid number of Finder Pattern detected

    前端生成二维码的方式有 jquery.qrcode,此处不赘述

  • 相关阅读:
    卡片式电脑介绍
    怎样对ListView的项进行排序
    jsp 声明类的使用
    Linux下启用Chrome/Firefox的Java插件
    strcmp函数和strcpy函数
    Python+Django+SAE系列教程9-----Django的视图和URL
    美团面试,面一次,累一次
    关于 Head First SQL 中文版
    Linux 内核的编译系统
    简单的REST的框架实现
  • 原文地址:https://www.cnblogs.com/jwen1994/p/12879799.html
Copyright © 2011-2022 走看看