zoukankan      html  css  js  c++  java
  • Java生成微信二维码及logo二维码

    依赖jar包

    二维码的实现有多种方法,比如 Google 的 zxing 和日本公司的 QrCode,本文以 QrCode 为例。

    QrCode.jar:https://pan.baidu.com/s/1c1PYV0s

    加入本地 maven

    mvn install:install-file -Dfile=QRCode.jar -DgroupId=QRCode -DartifactId=QRCode -Dversion=3.0 -Dpackaging=jar

    注意,QrCode 实现的二维码不能很好的支持中文。

    实例源码

    import com.swetake.util.Qrcode;
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    /**
     * 1、QrCode 生成二维码图片
     * 2、生成带有 logo 的二维码图片
     * Created by zhengbinMac on 2017/4/27.
     */
    public class QrCodeTest {
        /**
         * 生成二维码 Buffered
         * @param content 二维码内容
         * @return
         */
        public static BufferedImage QrcodeImage(String content) {
            // 二维码宽度
            int width = 140;
            // 二维码高度
            int height = 140;
    
            try {
                Qrcode qrcode = new Qrcode();
    
                // 设置二维码的排错率 'L':7%,'M':15%,'Q':25%,'H':30%
                qrcode.setQrcodeErrorCorrect('M');
                qrcode.setQrcodeEncodeMode('B');
    
                // 设置二维码的尺寸,尺寸越大,可存储的信息量越大
                qrcode.setQrcodeVersion(7);
                // 设置图片的尺寸、格式
                BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                // 绘制二维码的图片
                Graphics2D graphics2D = bufferedImage.createGraphics();
                // 设置背景颜色
                graphics2D.setBackground(Color.WHITE);
                // 创建二维码的矩形区域
                graphics2D.clearRect(0, 0, width, height);
    
                // 设置二维码图片的颜色值
                graphics2D.setColor(Color.BLACK);
                // 二维码生成点阵的偏移量
                int pixoff = 2;
                // 获取二维码内容的字节数组,并设置编码
                byte[] contentBytes = content.getBytes("UTF-8");
                // 输出二维码
                if (contentBytes.length > 0 && contentBytes.length < 200) { // 如果二维码内容在规定长度内
                    boolean[][] codeOut = qrcode.calQrcode(contentBytes);
                    for (int i = 0;i < codeOut.length;i++) {
                        for (int j = 0;j < codeOut.length;j++) {
                            if (codeOut[j][i]) {
                                graphics2D.fillRect(j*3+pixoff, i*3+pixoff, 3, 3);
                            }
                        }
                    }
                }
                graphics2D.dispose();
                bufferedImage.flush();
                return bufferedImage;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 在已有的二维码图片加上logo图片
         * @param twodimensioncodeImg   二维码图片文件
         * @param logoImg               logo图片文件
         * @return
         */
        public static BufferedImage encodeImgLogo(File twodimensioncodeImg,File logoImg){
            BufferedImage twodimensioncode = null;
            try{
                if(!twodimensioncodeImg.isFile() || !logoImg.isFile()){
                    System.out.println("输入非图片");
                    return null;
                }
                //读取二维码图片
                twodimensioncode = ImageIO.read(twodimensioncodeImg);
                //获取画笔
                Graphics2D g = twodimensioncode.createGraphics();
                //读取logo图片
                BufferedImage logo = ImageIO.read(logoImg);
                //设置二维码大小,太大,会覆盖二维码,此处20%
                int logoWidth = logo.getWidth(null) > twodimensioncode.getWidth()*3 /10 ? (twodimensioncode.getWidth()*3 /10) : logo.getWidth(null);
                int logoHeight = logo.getHeight(null) > twodimensioncode.getHeight()*3 /10 ? (twodimensioncode.getHeight()*3 /10) : logo.getHeight(null);
                // 确定二维码的中心位置坐标,设置logo图片放置的位置
                int x = (twodimensioncode.getWidth() - logoWidth) / 2;
                int y = (twodimensioncode.getHeight() - logoHeight) / 2;
                //开始合并绘制图片
                g.drawImage(logo, x, y, logoWidth, logoHeight, null);
                g.drawRoundRect(x, y, logoWidth, logoHeight, 15 ,15);
                //logo边框大小
                g.setStroke(new BasicStroke(2));
                //logo边框颜色
                g.setColor(Color.WHITE);
                g.drawRect(x, y, logoWidth, logoHeight);
                g.dispose();
                logo.flush();
                twodimensioncode.flush();
            }catch(Exception e){
                System.out.println("二维码绘制logo失败");
            }
            return twodimensioncode;
        }
    
        /**
         * 生成图片文件
         * @param bufferedImage 图片 buffered
         * @param imgPath       图片路径
         */
        public static void writeImage(BufferedImage bufferedImage, String imgPath) {
            // 生成二维码的图片
            File file = new File(imgPath);
            try {
                ImageIO.write(bufferedImage, "png", file);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            // 生成二维码
            BufferedImage qrCode = QrcodeImage("http://zhengbin.cnblogs.com");
            writeImage(qrCode, "/Users/zhengbinMac/Documents/qrcode/qecode2.png");
    
            // 生成带有图片logo的二维码
            File qrcode = new File("/Users/zhengbinMac/Documents/qrcode/qecode2.png");
            File logo = new File("/Users/zhengbinMac/Documents/qrcode/logo.png");
            BufferedImage logoQrcode = encodeImgLogo(qrcode, logo);
            writeImage(logoQrcode, "/Users/zhengbinMac/Documents/qrcode/logQrcode.png");
        }
    }

    二维码效果

    下面打开微信扫一下吧

    超链接二维码: 普通文本内容二维码:

    注意,超链接前需要加 ' http:// ',否则显示普通文本内容

    二维码的解析

    /**
     * 解析二维码
     */
    public static String decodeImg(String imgPath) {
        File imgFile = new File(imgPath);
        if (imgFile == null) {
            return null;
        }
        BufferedImage bufferedImage;
        String content = null;
        try {
            bufferedImage = ImageIO.read(imgFile);
            QRCodeDecoder decoder = new QRCodeDecoder();
            // decode 方法入参为 QRCodeImage,其是接口声明,需要实现该接口
            content = new String(decoder.decode(new CodeImg(bufferedImage)), "UTF-8");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return content;
    }
    /**
     * 实现 QRCodeImage 接口
     */
    static class CodeImg implements QRCodeImage{
        private BufferedImage image;
        public CodeImg(BufferedImage image) {
            super();
            this.image = image;
        }
        @Override
        public int getWidth() { return image.getWidth(); }
        @Override
        public int getHeight() { return image.getHeight(); }
        @Override
        public int getPixel(int x, int y) { return image.getRGB(x, y); }
        public BufferedImage getImage() { return image; }
        public void setImage(BufferedImage image) { this.image = image; }
    }
  • 相关阅读:
    Linux编程之UDP SOCKET全攻略
    Java8 flatMap的sample
    swagger bug
    bash中的pasue
    树、二叉树、满二叉树、完全二叉树概念分清
    复习一下高中数学
    SpringBoot Junit Maven JaCoCo
    事务传播和隔离
    springboot swagger2 泛型踩坑记
    Code::Blocks debug程序
  • 原文地址:https://www.cnblogs.com/zhengbin/p/6777639.html
Copyright © 2011-2022 走看看