1. 程式人生 > >Java實現帶logo的二維碼

Java實現帶logo的二維碼

你好 rpi type isp asi 照片 resp 繪制圖片 exc

Java實現帶logo的二維碼

二維碼應用到生活的各個方面,會用代碼實現二維碼,我想一定是一項加分的技能。好了,我們來一起實現一下吧。

我們實現的二維碼是基於QR Code的標準的,QR Code是由日本Denso公司於1994年研制的一種矩陣二維碼符號碼,全稱是Quick Response Code

QR Code:專利公開,支持中文;

QR Code與其他二維碼相比,具有識讀速度快、數據密度大、占用空間小的優勢;

糾錯能力:

L級:約可糾錯7%的數據碼字
M級:約可糾錯15%的數據碼字
Q級:約可糾錯25%的數據碼字
H級:約可糾錯30%的數據碼字

知道了這些硬知識後,我們做一下準備工作,我們需要下載兩個jar包,輔助我們開發,這裏我放上鏈接
http://mavenrepository.com/artifact/com.google.zxing/javase
http://mavenrepository.com/artifact/com.google.zxing/core/3.3.2

我們在我們的工程下,新建一個java project 項目就可以了,可以新建三個lib、utils、test三個文件夾;lib存放jar包,utils放我們寫的工具類,test用來放我們寫的測試類

我們先從不帶logo的二維碼開始
思路:

1、設置一些二維碼的參數;如 字符集、外邊距、容錯等級

2、生成二維碼

好了,我們來實現一下

/**
     * 
     * @param width 二維碼的寬
     *            
     * @param height 二維碼的高
     *            
     * @param content 二維碼的內容
     *            
     */
    public static void createQrCode(int width, int height, String content) {

        // 1、設置二維碼的一些參數
        HashMap hints = new HashMap();

        // 1.1設置字符集
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

        // 1.2設置容錯等級;因為有了容錯,在一定範圍內可以把二維碼p成你喜歡的樣式
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);

        // 1.3設置外邊距;(即白色區域)
        hints.put(EncodeHintType.MARGIN, 1);

        // 2、生成二維碼

        try {
            // 2.1定義BitMatrix對象
            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);

            // 2.2、設置二維碼存放路徑,以及二維碼的名字
            Path codePath = new File("c:/Users/admin/Desktop/code/" + UUID.randomUUID() + ".png").toPath();

            // 2.3、執行生成二維碼
            MatrixToImageWriter.writeToPath(bitMatrix, "png", codePath);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
我們來實現一下帶logo的二維碼
思路:

1、 我們先生成一個LogoConfig的配置類,主要是設置logo邊框顏色;logo邊框寬度;logo大小

2、 設置一些二維碼的參數

3、 生成二維碼

4、 生成帶logo的二維碼

我們來實現一下

LogoConfig類
class LogoConfig {
    // logo默認邊框顏色
    public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;
    // logo默認邊框寬度
    public static final int DEFAULT_BORDER = 2;
    // logo大小默認為照片的1/6
    public static final int DEFAULT_LOGOPART = 6;

    private final int border = DEFAULT_BORDER;
    private final Color borderColor;
    private final int logoPart;

    public LogoConfig() {
        this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);
    }

    public LogoConfig(Color borderColor, int logoPart) {
        this.borderColor = borderColor;
        this.logoPart = logoPart;
    }

    public Color getBorderColor() {
        return borderColor;
    }

    public int getBorder() {
        return border;
    }

    public int getLogoPart() {
        return logoPart;
    }
}
生成中間有logo的二維碼的工具函數
/**
     * 生成中間有logo的二維碼
     * 
     * @param width
     * @param height
     * @param content
     */
    public static void createLogoQrCode(int width, int height, String content) {

        // 1、設置二維碼的一些參數
        HashMap hints = new HashMap();

        // 1.1設置字符集
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

        // 1.2設置容錯等級;因為有了容錯,在一定範圍內可以把二維碼p成你喜歡的樣式
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

        // 1.3設置外邊距;(即白色區域)
        hints.put(EncodeHintType.MARGIN, 1);

        // 2、生成二維碼

        try {
            // 2.1定義BitMatrix對象
            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);

            // 2.2、設置二維碼存放路徑,以及二維碼的名字

            // qrFile用來存放生成的二維碼圖片
            File qrFile = new File("c:/Users/admin/Desktop/code", UUID.randomUUID() + ".jpg");

            // logoFile用來存放帶有logo的二維碼圖片
            File logoFile = new File("c:/Users/admin/Desktop/code", "test.jpg");

            // 2.3、執行生成二維碼
            MatrixToImageWriter.writeToPath(bitMatrix, "jpg", qrFile.toPath());

            // 2.4在二維碼中添加logo
            LogoConfig logoConfig = new LogoConfig();
            addLogo(qrFile, logoFile, logoConfig);
        
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
添加logo的工具類
/**
     * 
     * @param qrPic 二維碼文件路徑
     * @param logoPic logo文件路徑
     * @param logoConfig 配置類
     */
    private static void addLogo(File qrPic, File logoPic, LogoConfig logoConfig) {

        if (!qrPic.isFile() || !logoPic.isFile()) {
            System.out.println("file not found!");
            System.exit(0);
        }

        try {

            // 1、讀取二維碼圖片,並構建繪圖對象
            BufferedImage image = ImageIO.read(qrPic);
            Graphics2D graph = image.createGraphics();

            // 2、讀取logo圖片
            BufferedImage logo = ImageIO.read(logoPic);

            int widthLogo = image.getWidth() / logoConfig.getLogoPart();
            int heightLogo = image.getHeight() / logoConfig.getLogoPart();

            // 3、計算圖片放置的位置
            int x = (image.getWidth() - widthLogo) / 2;
            int y = (image.getHeight() - heightLogo) / 2;

            // 4、繪制圖片
            graph.drawImage(logo, x, y, widthLogo, heightLogo, null);
            graph.drawRoundRect(x, y, widthLogo, heightLogo, 10, 10);
            graph.setStroke(new BasicStroke(logoConfig.getBorder()));
            graph.setColor(logoConfig.getBorderColor());
            graph.drawRect(x, y, widthLogo, heightLogo);

            graph.dispose();
            
            ImageIO.write(image, "jpeg", new File("C:/Users/admin/Desktop/code/newPic.jpg"));

        } catch (Exception e) {
            System.out.println(e);

        }
    }

我們寫一個測試類來測試一下

@Test
public void test() {
        QrCodeUtils.createQrCode(100, 100, "你好,世界");
        
        QrCodeUtils.readQrCode("C:\\Users\\admin\\Desktop\\code\\4ad3a0a4-8d5c-4cd3-9ee5-5f680233a33f.png");
        
        QrCodeUtils.createLogoQrCode(300, 300, "https://www.jianshu.com/u/f84a2d49420b");
        QrCodeUtils.readQrCode("C:\\Users\\admin\\Desktop\\code\\newPic.jpg");
    }

我就不放生成好的二維碼了,大家可以自己試試

我們補充一個讀取二維碼內容的工具函數

/**
     * 解析二維碼
     * 
     * @param codePath 二維碼存放全路徑 
     *            
     */
    public static void readQrCode(String codePath) {

        try {

            MultiFormatReader formatReader = new MultiFormatReader();

            File QrCode = new File(codePath);

            BufferedImage image = ImageIO.read(QrCode);

            BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));

            // 設置二維碼的參數
            HashMap hints = new HashMap();

            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

            Result result = formatReader.decode(binaryBitmap, hints);

            // 打印解析結果
            System.out.println(result.toString());

            // 打印二維碼格式
            System.out.println(result.getBarcodeFormat());

            // 二維碼文本內容
            System.out.println(result.getText());

        } catch (Exception e) {
            System.out.println(e);
        }

    }

註:二維碼是有一定糾錯能力的,你可以把二維碼p成你喜歡的樣式

Java實現帶logo的二維碼