zoukankan      html  css  js  c++  java
  • ZXing生成二维码、读取二维码

    使用谷歌的开源包ZXing

    maven引入如下两个包即可

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

      

    1、工具类

    package com.unicom.zxing;
    
    import com.google.zxing.*;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.common.HybridBinarizer;
    import com.google.zxing.qrcode.QRCodeReader;
    import com.google.zxing.qrcode.QRCodeWriter;
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.*;
    import java.util.Hashtable;
    
    /**
     * 二维码生成和读的工具类
     *
     */
    public class ZXingUtil {
    
        /**
         * 生成包含字符串信息的二维码图片
         * @param outputStream 文件输出流路径
         * @param content 二维码携带信息
         * @param qrCodeSize 二维码图片大小
         * @param imageFormat 二维码的格式
         * @throws WriterException
         * @throws IOException
         */
        public static boolean createQrCode(OutputStream outputStream, String content, int qrCodeSize, String imageFormat) throws WriterException, IOException{
            //设置二维码纠错级别MAP
            Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>();
            hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);  // 矫错级别
            QRCodeWriter qrCodeWriter = new QRCodeWriter();
            //创建比特矩阵(位矩阵)的QR码编码的字符串
            BitMatrix byteMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, qrCodeSize, qrCodeSize, hintMap);
            // 使BufferedImage勾画QRCode  (matrixWidth 是行二维码像素点)
            int matrixWidth = byteMatrix.getWidth();
            BufferedImage image = new BufferedImage(matrixWidth-200, matrixWidth-200, BufferedImage.TYPE_INT_RGB);
            image.createGraphics();
            Graphics2D graphics = (Graphics2D) image.getGraphics();
            graphics.setColor(Color.WHITE);
            graphics.fillRect(0, 0, matrixWidth, matrixWidth);
            // 使用比特矩阵画并保存图像
            graphics.setColor(Color.BLACK);
            for (int i = 0; i < matrixWidth; i++){
                for (int j = 0; j < matrixWidth; j++){
                    if (byteMatrix.get(i, j)){
                        graphics.fillRect(i-100, j-100, 1, 1);
                    }
                }
            }
            return ImageIO.write(image, imageFormat, outputStream);
        }
    
        /**
         * 读二维码并输出携带的信息
         */
        public static void readQrCode(InputStream inputStream) throws IOException{
            //从输入流中获取字符串信息
            BufferedImage image = ImageIO.read(inputStream);
            //将图像转换为二进制位图源
            LuminanceSource source = new BufferedImageLuminanceSource(image);
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
            QRCodeReader reader = new QRCodeReader();
            Result result = null ;
            try {
                result = reader.decode(bitmap);
            } catch (ReaderException e) {
                e.printStackTrace();
            }
            System.out.println(result.getText());
        }
        /**
         * 测试代码
         * @throws WriterException
         */
        public static void main(String[] args) throws IOException, WriterException {
            //生成二维码到E盘
            createQrCode(new FileOutputStream(new File("E:\test.jpg")),"https://www.baidu.com/",900,"JPEG");
            //下面是读取二维码内容
            readQrCode(new FileInputStream(new File("E:\test.jpg")));
        }
    
    }
    

    直接运行Main方法,即可在E盘生成二维码

    微信扫一扫,即可跳转到百度网页

  • 相关阅读:
    【转载】中文分词整理
    【转载】浅谈事件冒泡与事件捕获
    【转载】SpringCloud-Eurek 心跳阈值说明
    【转载】Linux下查看CPU、内存占用率
    Linux内存、性能诊断中vmstat命令的详解
    【转载】springboot四 全局异常处理
    【转载】linux系统时间自动同步:ntp
    springboot整合三 共享session,集成springsession
    git把一个分支上的某个提交合并到另一个分支
    VS Code打开新的文件会覆盖窗口中的,怎么改
  • 原文地址:https://www.cnblogs.com/Donnnnnn/p/10837620.html
Copyright © 2011-2022 走看看