00042-java 生成qrCode

參數類:java

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;
    }
}

圖標配置類:apache

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); // 調用超類構造器
    }
}

工具處理類:ide

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");
相關文章
相關標籤/搜索