参数类:

import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;/** *  */public class QRCodeParams {    private String txt; // 二维码内容    private String qrCodeUrl; // 二维码网络门路    private String logoPath; // logo图片    private Integer width = 300; // 二维码宽度    private Integer height = 300; // 二维码高度    private Integer onColor = 0xFF000000; // 前景色    private Integer offColor = 0xFFFFFFFF; // 背景色    private Integer margin = 1; // 白边大小,取值范畴0~4    private ErrorCorrectionLevel level = ErrorCorrectionLevel.L; // 二维码容错率    public String getTxt() {        return txt;    }    public void setTxt(String txt) {        this.txt = txt;    }    public Integer getWidth() {        return width;    }    public void setWidth(Integer width) {        this.width = width;    }    public Integer getHeight() {        return height;    }    public void setHeight(Integer height) {        this.height = height;    }    public String getQrCodeUrl() {        return qrCodeUrl;    }    public void setQrCodeUrl(String qrCodeUrl) {        this.qrCodeUrl = qrCodeUrl;    }    public String getLogoPath() {        return logoPath;    }    public void setLogoPath(String logoPath) {        this.logoPath = logoPath;    }    public Integer getOnColor() {        return onColor;    }    public void setOnColor(Integer onColor) {        this.onColor = onColor;    }    public Integer getOffColor() {        return offColor;    }    public void setOffColor(Integer offColor) {        this.offColor = offColor;    }    public ErrorCorrectionLevel getLevel() {        return level;    }    public void setLevel(ErrorCorrectionLevel level) {        this.level = level;    }    public Integer getMargin() {        return margin;    }    public void setMargin(Integer margin) {        this.margin = margin;    }}

图标配置类:

import java.awt.BasicStroke;import java.awt.Color;import java.awt.Graphics2D;import java.awt.geom.RoundRectangle2D;import java.awt.image.BufferedImage;import java.io.IOException;import java.net.URL;import java.net.URLConnection;import javax.imageio.ImageIO;/** */public class QRLogoConfig {    /**     * 设置 logo     *      * @param matrixImage     *            源二维码图片     * @return 返回带有logo的二维码图片     * @throws IOException     * @author Administrator sangwenhao     */    public BufferedImage LogoMatrix(BufferedImage matrixImage, String logoPath)            throws IOException {        /**         * 读取二维码图片,并构建绘图对象         */        Graphics2D g2 = matrixImage.createGraphics();        int matrixWidth = matrixImage.getWidth();        int matrixHeigh = matrixImage.getHeight();        int num = logoPath.indexOf('/', 8);        String u = logoPath.substring(0, num);        URL url = new URL(logoPath);        URLConnection connection = url.openConnection();        connection.setDoOutput(true);        connection.setRequestProperty("referer", u);        /**         * 读取Logo图片         */        BufferedImage logo = ImageIO.read(connection.getInputStream());        // 开始绘制图片        g2.drawImage(logo, matrixWidth / 5 * 2, matrixHeigh / 5 * 2,                matrixWidth / 5, matrixHeigh / 5, null);// 绘制        BasicStroke stroke = new BasicStroke(5, BasicStroke.CAP_ROUND,                BasicStroke.JOIN_ROUND);        g2.setStroke(stroke);// 设置笔画对象        // 指定弧度的圆角矩形        RoundRectangle2D.Float round = new RoundRectangle2D.Float(                matrixWidth / 5 * 2, matrixHeigh / 5 * 2, matrixWidth / 5,                matrixHeigh / 5, 20, 20);        g2.setColor(Color.white);        g2.draw(round);// 绘制圆弧矩形        // 设置logo 有一道灰色边框        BasicStroke stroke2 = new BasicStroke(1, BasicStroke.CAP_ROUND,                BasicStroke.JOIN_ROUND);        g2.setStroke(stroke2);// 设置笔画对象        RoundRectangle2D.Float round2 = new RoundRectangle2D.Float(                matrixWidth / 5 * 2 + 2, matrixHeigh / 5 * 2 + 2,                matrixWidth / 5 - 4, matrixHeigh / 5 - 4, 20, 20);        g2.setColor(new Color(128, 128, 128));        g2.draw(round2);// 绘制圆弧矩形        g2.dispose();        matrixImage.flush();        return matrixImage;    }}

异样类:

/** *  */public class QRParamsException extends Exception {    private static final long serialVersionUID = 8837582301762730656L;    public QRParamsException() {    } // 用来创立无参数对象    public QRParamsException(String message) { // 用来创立指定参数对象        super(message); // 调用超类结构器    }}

工具解决类:

import java.awt.Color;import java.awt.Graphics2D;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.IOException;import java.util.Hashtable;import javax.imageio.ImageIO;import org.apache.commons.lang3.StringUtils;import com.google.zxing.BarcodeFormat;import com.google.zxing.EncodeHintType;import com.google.zxing.MultiFormatWriter;import com.google.zxing.common.BitMatrix;import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;/** *  */public class QRCodeUtil {    private static int width = 500; // 二维码宽度    private static int height = 500; // 二维码高度    private static int onColor = 0xFF000000; // 前景色    private static int offColor = 0xFFFFFFFF; // 背景色    private static int margin = 1; // 白边大小,取值范畴0~4    private static ErrorCorrectionLevel level = ErrorCorrectionLevel.L; // 二维码容错率    /**     * 生成二维码     *      * @param params     *            QRCodeParams属性:txt、fileName、filePath不得为空;     * @throws QRParamsException     */    public static ByteArrayOutputStream generateQRImage(QRCodeParams params)            throws QRParamsException {        if (params == null || params.getTxt() == null) {            throw new QRParamsException("参数谬误");        }        try {            initData(params);            String txt = params.getTxt();            if (StringUtils.isNoneBlank(params.getLogoPath())) {                return generateQRImage(txt, params.getLogoPath());            } else {                return generateQRImage(txt);            }        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * 生成二维码     *      * @param txt     *            //二维码内容     */    public static ByteArrayOutputStream generateQRImage(String txt) {        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();        // 指定纠错等级        hints.put(EncodeHintType.ERROR_CORRECTION, level);        // 指定编码格局        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");        hints.put(EncodeHintType.MARGIN, margin);        try {            BitMatrix bitMatrix = new MultiFormatWriter().encode(txt,                    BarcodeFormat.QR_CODE, width, height, hints);            BufferedImage image = toBufferedImage(bitMatrix);            ByteArrayOutputStream out = new ByteArrayOutputStream();            try {                ImageIO.write(image, "PNG", out);                return out;            } catch (IOException e) {                e.printStackTrace();            }        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * 生成带logo的二维码图片     *      * @param txt     *            //二维码内容     * @param logoPath     *            //logo相对物理门路     * @throws Exception     */    public static ByteArrayOutputStream generateQRImage(String txt,            String logoPath) throws Exception {        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();        // 指定纠错等级,纠错级别(L 7%、M 15%、Q 25%、H 30%)        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");        hints.put(EncodeHintType.ERROR_CORRECTION, level);        hints.put(EncodeHintType.MARGIN, margin);        BitMatrix bitMatrix = new MultiFormatWriter().encode(txt,                BarcodeFormat.QR_CODE, width, height, hints);        return writeToFile(bitMatrix, logoPath);    }    /**     *      * @param matrix     *            二维码矩阵相干     * @param format     *            二维码图片格式     * @param file     *            二维码图片文件     * @param logoPath     *            logo门路     * @throws IOException     */    public static void writeToFile(BitMatrix matrix, String format, File file,            String logoPath) throws IOException {        BufferedImage image = toBufferedImage(matrix);        Graphics2D gs = image.createGraphics();        int ratioWidth = image.getWidth() * 2 / 10;        int ratioHeight = image.getHeight() * 2 / 10;        // 载入logo        Image img = ImageIO.read(new File(logoPath));        int logoWidth = img.getWidth(null) > ratioWidth ? ratioWidth : img                .getWidth(null);        int logoHeight = img.getHeight(null) > ratioHeight ? ratioHeight : img                .getHeight(null);        int x = (image.getWidth() - logoWidth) / 2;        int y = (image.getHeight() - logoHeight) / 2;        gs.drawImage(img, x, y, logoWidth, logoHeight, null);        gs.setColor(Color.black);        gs.setBackground(Color.WHITE);        gs.dispose();        img.flush();        if (!ImageIO.write(image, format, file)) {            throw new IOException("Could not write an image of format "                    + format + " to " + file);        }    }    public static ByteArrayOutputStream writeToFile(BitMatrix matrix,            String logoPath) throws IOException {        BufferedImage image = toBufferedImage(matrix);        // 设置logo图标        QRLogoConfig logoConfig = new QRLogoConfig();        image = logoConfig.LogoMatrix(image, logoPath);        ByteArrayOutputStream out = new ByteArrayOutputStream();        try {            ImageIO.write(image, "PNG", out);            return out;        } catch (IOException e) {            e.printStackTrace();        }        return null;    }    public static BufferedImage toBufferedImage(BitMatrix matrix) {        int width = matrix.getWidth();        int height = matrix.getHeight();        BufferedImage image = new BufferedImage(width, height,                BufferedImage.TYPE_INT_RGB);        for (int x = 0; x < width; x++) {            for (int y = 0; y < height; y++) {                image.setRGB(x, y, matrix.get(x, y) ? onColor : offColor);            }        }        return image;    }    public static BitMatrix deleteWhite(BitMatrix matrix) {        int[] rec = matrix.getEnclosingRectangle();        int resWidth = rec[2] + 1;        int resHeight = rec[3] + 1;        BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);        resMatrix.clear();        for (int i = 0; i < resWidth; i++) {            for (int j = 0; j < resHeight; j++) {                if (matrix.get(i + rec[0], j + rec[1]))                    resMatrix.set(i, j);            }        }        return resMatrix;    }    private static void initData(QRCodeParams params) {        if (params.getWidth() != null) {            width = params.getWidth();        }        if (params.getHeight() != null) {            height = params.getHeight();        }        if (params.getOnColor() != null) {            onColor = params.getOnColor();        }        if (params.getOffColor() != null) {            offColor = params.getOffColor();        }        if (params.getLevel() != null) {            level = params.getLevel();        }    }}

调用:

QRCodeParams qrParams = new QRCodeParams();//            url = "http://192.168.1.2:8086/business";            qrParams.setTxt(url);            qrParams.setWidth(300);            qrParams.setHeight(300);            ByteArrayOutputStream out = QRCodeUtil.generateQRImage(qrParams);            qrCode = this.uploadService.upload(out,IdUtils.id()+".png");