Java 二维码生成工具类

public class QRcodeUtils {

    /**
     * 容错率等级 L
     */
    public static final char CORRECT_L = ‘L‘;

    /**
     * 容错率等级 M
     */
    public static final char CORRECT_M = ‘M‘;

    /**
     * 容错率等级 Q
     */
    public static final char CORRECT_Q = ‘Q‘;

    /**
     * 容错率等级 H
     */
    public static final char CORRECT_H = ‘H‘;

    /**
     * 旁白占用比率
     */
    public static final double PADDING_RATIO = 0.05;

    /**
     * 生成二维码
     * @param content 要生成的内容
     * @param size    要生成的尺寸
     * @param versoin 二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
     * @param ecc 二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%)
     * @return
     * @throws Exception
     */
    public static BufferedImage encode(String content, int size, int version, char ecc, BufferedImage logo) throws Exception{
        BufferedImage image = null;
        Qrcode qrcode = new Qrcode();
        // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
        qrcode.setQrcodeErrorCorrect(ecc);
        qrcode.setQrcodeEncodeMode(‘B‘);
        // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
        qrcode.setQrcodeVersion(version);
        // 获得内容的字节数组,设置编码格式
        byte[] contentBytes = content.getBytes("utf-8");  

        double ratio = 3;//默认放大三倍
        int qrcodeSize = 21 + 4 * (version - 1);
        if(size > 0){
            ratio = (double)size / qrcodeSize;
        }
        int intRatio = (int)Math.ceil(ratio);

        //旁白
        int padding = (int)Math.ceil(qrcodeSize * intRatio * PADDING_RATIO);
        if(padding < 10){
            padding = 10;
        }

        // 图片尺寸
        int imageSize = qrcodeSize * intRatio + padding * 2;
        image = new BufferedImage(imageSize, imageSize, BufferedImage.TYPE_INT_RGB);
        Graphics2D gs = image.createGraphics();
        // 设置背景颜色
        gs.setBackground(Color.WHITE);
        gs.clearRect(0, 0, imageSize, imageSize);  

        // 设定图像颜色  BLACK
        gs.setColor(Color.BLACK);

        // 输出内容  二维码
        if (contentBytes.length > 0 && contentBytes.length < 800) {
            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]) {
                        gs.fillRect(j * intRatio + padding, i * intRatio + padding, intRatio, intRatio);
                    }
                }
            }
        } else {
            throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");
        }

        if(logo != null){
            int logoSize = imageSize / 4;
            int p = ( imageSize - logoSize ) / 2;
            logo = ImageUtils.setRadius(logo);
            gs.drawImage(logo, p,  p, logoSize, logoSize, null);
        }

        gs.dispose();
        image.flush();

        if(intRatio > ratio){
            image = resize(image, (int)Math.ceil(ratio * imageSize / intRatio ));
        }
        return image;
    }

    /**
     * 生成二维码
     * @param content
     * @param size
     * @param version
     * @param ecc
     * @return
     * @throws Exception
     */
    public static BufferedImage encode(String content, int size, int version, char ecc) throws Exception{
        return encode(content, size, version, ecc, null);
    }

    /**
     * 生成二维码
     * @param content
     * @param size
     * @return
     * @throws Exception
     */
    public static BufferedImage encode(String content, int size) throws Exception{
        return encode(content, size, 9, CORRECT_Q);
    }

    /**
     * 生成二维码
     * @param content
     * @param size
     * @param version
     * @return
     */
    public static BufferedImage encode(String content, int size, int version) throws Exception{
        return encode(content, size, version, CORRECT_Q);
    }

    /**
     * 生成二维码
     * @param content
     * @param size
     * @param logo
     * @return
     */
    public static BufferedImage encode(String content, int size, BufferedImage logo) throws Exception{
        return encode(content, size, 9, CORRECT_Q, logo);
    }

    /**
     * 生成二维码
     * @param content
     * @param size
     * @param ecc
     * @return
     */
    public static BufferedImage encode(String content, int size, char ecc) throws Exception{
        return encode(content, size, 9, ecc);
    }

    /**
     * 生成二维码
     * @param content
     * @return
     */
    public static BufferedImage encode(String content) throws Exception{
        return encode(content, 0, 9, CORRECT_Q);
    }

    /**
     * 解析二维码
     * @throws UnsupportedEncodingException
     * @throws DecodingFailedException
     */
    public static String decode(BufferedImage bufferedImage) throws DecodingFailedException, UnsupportedEncodingException{
         QRCodeDecoder decoder = new QRCodeDecoder();
         return new String(decoder.decode(new MyQRCodeImage(bufferedImage)), "utf-8");
    }

    /**
     * 图片缩放
     */
    private static BufferedImage resize(BufferedImage image, int size){
        BufferedImage bufferedImage = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
        Graphics2D gs = bufferedImage.createGraphics();
        gs.setBackground(Color.WHITE);
        gs.clearRect(0, 0, size, size);
        gs.setColor(Color.BLACK);
        gs.fillRect(0, 0, size, size);
        gs.drawImage(image, 0, 0, size, size, null);
        gs.dispose();
        image.flush();
        return bufferedImage;
    }

}
时间: 2024-10-05 23:37:39

Java 二维码生成工具类的相关文章

二维码生成工具类

1 package com.ideal.common.util; 2 3 import java.awt.image.BufferedImage; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.FileNotFoundException; 7 import java.io.FileOutputStream; 8 import java.util.UUID; 9 10 import net.glx

二维码生成工具类java版

注意:这里我不提供所需jar包的路径,我会把所有引用的jar包显示出来,大家自行Google package com.net.util; import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Shape; import java.awt.geom.RoundRectangle2D; import java.a

zxing二维码生成工具类

图片生成工具生成 1.支持多中形式的图片,二维码,条形码 2.支持一张图片多个二维码 3.支持二维码图片上加logo 4.支持图片头部底部添加文字描述 public class ZxingEncoderUtil { private static final String CHARSET = "utf-8"; private static final String FORMAT = "JPG"; private static Font font = null; /**

Java版本logo 名片二维码生成工具类

 package com.zzq; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Shape; import java.awt.font.FontRenderContext; import java.awt.ge

java二维码生成工具

import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Hashtable; import java.util.Map; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.BinaryBitmap; import

Java二维码生成与解码

基于google zxing 的Java二维码生成与解码 一.添加Maven依赖(解码时需要上传二维码图片,所以需要依赖文件上传包) <!-- google二维码工具 --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.1.0</version> </dependen

java 二维码生成

直接上代码: 二维码生成核心类: package com.bbkj.wechat.tool; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.EnumMap; import javax.imageio.ImageIO; import com.google.zxing.BarcodeF

java二维码生成

二维码,是一种采用黑白相间的平面几何图形经过相应的编码算法来记载文字.图画.网址等信息的条码图画.如下图 二维码的特色: 1.  高密度编码,信息容量大 可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比一般条码信息容量约高几十倍. 2.  编码规模广 该条码能够把图画.声响.文字.签字.指纹等能够数字化的信息进行编码,用条码表明出来:能够表明多种语言文字:可表明图画数据. 3.  容错能力强,具有纠错功用 这使得二维条码因穿孔.污损等导致部分损坏时,照样能够正确

java 二维码生成(可带图片)springboot版

本文(2019年6月29日 飞快的蜗牛博客) 有时候,男人和女人是两个完全不同的世界,男人的玩笑和女人的玩笑也完全是两码事,爱的人完全不了解你,你也不要指望一个女人了解你,所以男的不是要求别人怎么样,是要求自己怎么样,男人更应该对自己好点,照顾好自己是最基本的, 不然你怎么照顾别人,男人是竞争的产物不是吗? 言归正传: 首先加入依赖我的目前依赖是: <!-- 二维码生成 --><dependency> <groupId>com.google.zxing</grou