zoukankan      html  css  js  c++  java
  • QrcodeWithLogo


    package com.qrcode;
    
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import javax.imageio.ImageIO;
    
    import com.swetake.util.Qrcode;
    
    public class QrcodeWithLogo {
    
        private static final String DATE_FORMAT = "yyyyMMddHH24mmssS";
    
        private static ThreadLocal<DateFormat> threadLocal = new
                ThreadLocal<DateFormat>() {
                    protected synchronized DateFormat initialValue() {
                        return new SimpleDateFormat(DATE_FORMAT);
                    }
                };
    
        public static String getTimeStamp() {
            return threadLocal.get().format(new Date());
        }
    
        public static int createQRCode(String content, String imgPath, String logo) {
            try {
                Qrcode qrcodeHandler = new Qrcode();
                qrcodeHandler.setQrcodeErrorCorrect('M');
                qrcodeHandler.setQrcodeEncodeMode('B');
                qrcodeHandler.setQrcodeVersion(7);
                byte[] contentBytes = content.getBytes("gb2312");
                // 构造一个BufferedImage对象 设置宽、高
                BufferedImage bufImg = new BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB);
                Graphics2D gs = bufImg.createGraphics();
                gs.setBackground(Color.WHITE);
                gs.clearRect(0, 0, 140, 140);
                // 设定图像颜色 > BLACK
                gs.setColor(Color.BLACK);
                // 设置偏移量 不设置可能导致解析出错
                int pixoff = 2;
                // 输出内容 > 二维码
                if (contentBytes.length > 0 && contentBytes.length < 120) {
                    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 {
                    System.err.println("QRCode content bytes length = " + contentBytes.length + " not in [ 0,120 ]. ");
                    return -1;
                }
                Image img = ImageIO.read(new File(logo));// 实例化一个Image对象。
                gs.drawImage(img, 44, 55, 49, 30, null);
                gs.dispose();
                bufImg.flush();
                // 生成二维码QRCode图片
                File imgFile = new File(imgPath);
                ImageIO.write(bufImg, "png", imgFile);
            } catch (Exception e) {
                e.printStackTrace();
                return -100;
            }
            return 0;
        }
    
        public static void main(String[] args) {
            String content = "www.cnblogs.com/softidea";
            String imgPath = "qr" + getTimeStamp() + ".jpg";
            String logo = "logo.png";
    
            createQRCode(content, imgPath, logo);
        }
    }

     Qrcode.jar

  • 相关阅读:
    如何很“礼貌”的避免抛出空指针异常
    如何优雅的使用第三方插件写实体类
    IntelliJ IDEA(2019.03)破解教程(亲测实用)
    vue.js 中使用(...)运算符报错的解决方法
    44个Java性能优化
    Spring MVC原理及配置
    Intellij IDEA 从入门到上瘾 图文教程
    JVM系列二 GC策略&内存申请、对象衰老
    Spring MVC国际化配置
    Java性能优化的50个细节(珍藏版)
  • 原文地址:https://www.cnblogs.com/softidea/p/4606243.html
Copyright © 2011-2022 走看看