• 用Java画QRCode二维码


    支付宝、微信扫码支付的二维码,第三方的类库QRCode.jar 还是很好用的。下面贴出来这个东东生成二维码的代码。

    使用时注意包括图片地址、编码内容、图片属性等几个参数,支付宝的它们的扫码回调地址。

    一、导入QRCode.jar包

    二、QRCode工具类

    package util;
    
    import java.awt.Color; 
    import java.awt.Graphics2D; 
    import java.awt.image.BufferedImage; 
    import java.io.File; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.OutputStream; 
    
    import javax.imageio.ImageIO; 
    import jp.sourceforge.qrcode.QRCodeDecoder; 
    import jp.sourceforge.qrcode.exception.DecodingFailedException; 
    import com.swetake.util.Qrcode;
    import bean.CustomCodeImage; 
    
    public class QrCodeUtil {
        /** 
         * 生成二维码(QRCode)图片 
        * @param content 存储内容 
        * @param imgPath 图片路径 
        */ 
        public void encoderQRCode(String content, String imgPath) { 
            this.encoderQRCode(content, imgPath, "png", 10); 
         } 
    
         /** 
         * 生成二维码(QRCode)图片 
        * @param content 存储内容 
        * @param output 输出流 
        */ 
        public void encoderQRCode(String content, OutputStream output) { 
            this.encoderQRCode(content, output, "png", 10); 
         } 
    
         /** 
         * 生成二维码(QRCode)图片 
        * @param content 存储内容 
        * @param imgPath 图片路径 
        * @param imgType 图片类型 
        */ 
        public void encoderQRCode(String content, String imgPath, String imgType) { 
            this.encoderQRCode(content, imgPath, imgType, 10); 
         } 
    
         /** 
         * 生成二维码(QRCode)图片 
        * @param content 存储内容 
        * @param output 输出流 
        * @param imgType 图片类型 
        */ 
        public void encoderQRCode(String content, OutputStream output, String imgType) { 
            this.encoderQRCode(content, output, imgType, 10); 
         } 
    
         /** 
         * 生成二维码(QRCode)图片 
        * @param content 存储内容 
        * @param imgPath 图片路径 
        * @param imgType 图片类型 
        * @param size 二维码尺寸 
        */ 
        public void encoderQRCode(String content, String imgPath, String imgType, int size) { 
             try { 
                 BufferedImage bufImg = this.qRCodeCommon(content, imgType, size); 
            
                 File imgFile = new File(imgPath); 
                 // 生成二维码QRCode图片 
                 ImageIO.write(bufImg, imgType, imgFile); 
             } catch (Exception e) { 
                 e.printStackTrace(); 
             } 
         } 
    
         /** 
         * 生成二维码(QRCode)图片 
        * @param content 存储内容 
        * @param output 输出流 
        * @param imgType 图片类型 
        * @param size 二维码尺寸 
        */ 
        public void encoderQRCode(String content, OutputStream output, String imgType, int size) { 
             try { 
                 BufferedImage bufImg = this.qRCodeCommon(content, imgType, size); 
                 // 生成二维码QRCode图片 
                 ImageIO.write(bufImg, imgType, output); 
             } catch (Exception e) { 
                 e.printStackTrace(); 
             } 
         } 
    
         /** 
         * 生成二维码(QRCode)图片的公共方法 
        * @param content 存储内容 
        * @param imgType 图片类型 
        * @param size 二维码尺寸 
        * @return 
         */ 
         private BufferedImage qRCodeCommon(String content, String imgType, int size) { 
             BufferedImage bufImg = null; 
             try { 
                 Qrcode qrcodeHandler = new Qrcode(); 
                 // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小 
                qrcodeHandler.setQrcodeErrorCorrect('M'); 
                 qrcodeHandler.setQrcodeEncodeMode('B'); 
                 // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大 
                qrcodeHandler.setQrcodeVersion(size); 
                 // 获得内容的字节数组,设置编码格式 
                byte[] contentBytes = content.getBytes("utf-8"); 
                 // 图片尺寸 
                int imgSize = 67 + 12 * (size - 1); 
                 bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB); 
                 Graphics2D gs = bufImg.createGraphics(); 
                 // 设置背景颜色 
                gs.setBackground(Color.WHITE); 
                 gs.clearRect(0, 0, imgSize, imgSize); 
            
                 // 设定图像颜色> BLACK 
                 gs.setColor(Color.BLACK); 
                 // 设置偏移量,不设置可能导致解析出错 
                int pixoff = 2; 
                 // 输出内容> 二维码 
                if (contentBytes.length > 0 && contentBytes.length < 1600) { 
                 boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes); 
                 for (int i = 0; i < codeOut.length; i++) { 
                 for (int j = 0; j < codeOut.length; j++) { 
                 if (codeOut[j][i]) { 
                 gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3); 
                 } 
             } 
             } 
             } else { 
             throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800]."); 
             } 
             gs.dispose(); 
             bufImg.flush(); 
             } catch (Exception e) { 
             e.printStackTrace(); 
             }
             return bufImg; 
         } 
    
         /** 
         * 解析二维码(QRCode) 
        * @param imgPath 图片路径 
        * @return 
         */ 
         public String decoderQRCode(String imgPath) { 
             // QRCode 二维码图片的文件 
             File imageFile = new File(imgPath); 
             BufferedImage bufImg = null; 
             String content = null; 
             try { 
             bufImg = ImageIO.read(imageFile); 
             QRCodeDecoder decoder = new QRCodeDecoder(); 
             content = new String(decoder.decode(new CustomCodeImage(bufImg)), "utf-8"); 
             } catch (IOException e) { 
             System.out.println("Error: " + e.getMessage()); 
             e.printStackTrace(); 
             } catch (DecodingFailedException dfe) { 
             System.out.println("Error: " + dfe.getMessage()); 
             dfe.printStackTrace(); 
             } 
             return content; 
         } 
    
         /** 
         * 解析二维码(QRCode) 
        * @param input 输入流 
        * @return 
         */ 
         public String decoderQRCode(InputStream input) { 
             BufferedImage bufImg = null; 
             String content = null; 
             try { 
             bufImg = ImageIO.read(input); 
             QRCodeDecoder decoder = new QRCodeDecoder(); 
             content = new String(decoder.decode(new CustomCodeImage(bufImg)), "utf-8"); 
             } catch (IOException e) { 
             System.out.println("Error: " + e.getMessage()); 
             e.printStackTrace(); 
             } catch (DecodingFailedException dfe) { 
             System.out.println("Error: " + dfe.getMessage()); 
             dfe.printStackTrace(); 
             } 
             return content; 
         } 
    }
    View Code

    三、图片Bean

    package bean;
    import java.awt.image.BufferedImage; 
    import jp.sourceforge.qrcode.data.QRCodeImage; 
    public class CustomCodeImage implements QRCodeImage { 
    
         BufferedImage bufImg; 
    
         public CustomCodeImage(BufferedImage bufImg) { 
         this.bufImg = bufImg; 
         } 
    
         @Override 
         public int getHeight() { 
         return bufImg.getHeight(); 
         } 
    
         @Override 
         public int getPixel(int x, int y) { 
         return bufImg.getRGB(x, y); 
         } 
    
         @Override 
         public int getWidth() { 
         return bufImg.getWidth(); 
         } 
    
    }
    View Code
  • 相关阅读:
    net.sf.json.JSONException: There is a cycle in the hierarchy!
    数据源的配置
    java枚举使用详解
    hibernate级联保存,更新个人遇到的问题
    NonUniqueObjectException 问题
    No.2 dotnetcore&docker--数据库等在Docker上的配置
    No.1 dotnetcore&docker--环境搭建
    No.5 dotnetcore&docker--采用Ambry做文件服务器
    No.3 dotnetcore&docker--搭建一个nuget服务器
    关于APM数据采集实例以及Eureka整合的一个想法
  • 原文地址:https://www.cnblogs.com/windy2008/p/8398233.html
Copyright © 2020-2023  润新知