Quick-Media 中文二維碼支持

Quick-Media 中文二維碼支持

Quick-Media 項目提供了一些列多媒體操做的開箱即用工具類,好比圖片編輯合成,markdown/html/svg渲染,音頻處理;固然還有本文重點說明的二維碼生成解析html

QrCode-Plugin支持豐富的酷炫二維碼生成,大概十來天前有個小夥伴提了一個很是有意思的方向,可否將二維碼中的黑白方塊換成中文java

趁着端午放假前夕的空閒時間,把這個集成在QrCode插件中,生成效果以下(從左往右,從上往下讀,千字文?)git

<!-- more -->github

I. 使用說明

1. maven導入

對於java環境的小夥伴,能夠藉助maven引入依賴包markdown

<repositories>
    <repository>
        <id>yihui-maven-repo</id>
        <url>https://raw.githubusercontent.com/liuyueyi/maven-repository/master/repository</url>
    </repository>
</repositories>

<dependency>
    <groupId>com.github.hui.media</groupId>
    <artifactId>qrcode-plugin</artifactId>
    <version>2.4.1</version>
</dependency>

或者使用jitpack導入依賴也是能夠的app

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>


<!-- 請注意groupId和github的方式有一些區別哦 -->
<dependency>
    <groupId>com.github.liuyueyi.quick-media</groupId>
    <artifactId>qrcode-plugin</artifactId>
    <version>2.4</version>
</dependency>

2. 源碼方式

對於源碼的使用方式就比較簡單了,下載源碼,直接在test目錄下編寫測試case便可maven

源碼地址: Quick-Mediasvg

3. 使用case

先來看一下,如何生成文字二維碼,一個最簡單的使用case以下工具

/**
 * 文字二維碼,順序方式渲染
 */
@Test
public void fontQr1() {
    String msg = "http://weixin.qq.com/r/FS9waAPEg178rUcL93oH";
    try {
        boolean ans = QrCodeGenWrapper.of(msg)
                .setErrorCorrection(ErrorCorrectionLevel.H)
                // 指定渲染模式爲TXT便可
                .setDrawStyle(QrCodeOptions.DrawStyle.TXT)
                .setPicType("png")
                .asFile("/tmp/fontQr1.png");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

上面的使用能夠說很是簡單明瞭,QrCode-Plugin默認提供的文字集爲千字文,字體爲宋體,若是但願生成最上面的二維碼(三個標準的探測圖形,識別率更高)加一個選項.setDetectSpecial()便可學習

/**
 * 文字二維碼,順序方式渲染
 */
@Test
public void fontQr2() {
    String msg = "http://weixin.qq.com/r/FS9waAPEg178rUcL93oH";

    try {
        boolean ans = QrCodeGenWrapper.of(msg)
                // 不輸入文字時,默認採用千字文
                // 默認文字順序渲染
                // true 則探測圖形有本身的繪製規則
                .setDetectSpecial()
                .setErrorCorrection(ErrorCorrectionLevel.H)
                .setDrawStyle(QrCodeOptions.DrawStyle.TXT)
                .setPicType("png")
                .asFile("/tmp/fontQr2.png");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

固然咱們也能夠用自定義的文字來生成二維碼,並指定選擇文字的方式爲隨機

/**
 * 文字二維碼
 */
@Test
public void fontQr3() {
    String msg = "http://weixin.qq.com/r/FS9waAPEg178rUcL93oH";

    try {
        boolean ans = QrCodeGenWrapper.of(msg)
                .setQrText("歡迎關注一灰灰")
                // 指定文字隨機渲染方式
                .setQrTxtMode(QrCodeOptions.TxtMode.RANDOM)
                // true 則探測圖形有本身的繪製規則
                .setDetectSpecial()
                .setErrorCorrection(ErrorCorrectionLevel.H)
                .setDrawStyle(QrCodeOptions.DrawStyle.TXT)
                // 當相鄰的NxN都是黑色小方塊時,放大(慎用,由於部分漢子如 `一` 沒法友好的填充2x2的方塊)
                .setDrawEnableScale(true)
                .setPicType("png")
                .asFile("/tmp/fontQr3.png");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

4. 背景文字

除了上面這種文字方式以外,還有一種以下圖的這種,二維碼顯示一個字的狀況

上面這個二維碼,主要是藉助背景圖的渲染方式來實現,背景圖上爲一張淺灰底色,紅字,二維碼採用PENETRATE背景圖穿透的模式,具體實現以下

@Test
public void bgQrTxt() {
    try {
        String msg = "http://weixin.qq.com/r/FS9waAPEg178rUcL93oH";
        BufferedImage bgImg = GraphicUtil.createImg(500, 500, null);
        Graphics2D g2d = GraphicUtil.getG2d(bgImg);
        g2d.setColor(Color.LIGHT_GRAY);
        g2d.fillRect(0, 0, 500, 500);

        Font font = new Font("宋體", Font.BOLD, 500);
        g2d.setFont(font);
        g2d.setColor(Color.RED);
        g2d.drawString("碼", 0, 500 - g2d.getFontMetrics().getDescent() / 2);
        g2d.dispose();

        boolean ans =
                QrCodeGenWrapper.of(msg).setBgImg(bgImg).setBgStyle(QrCodeOptions.BgImgStyle.PENETRATE).setBgW(500)
                        .setBgH(500).setW(500).asFile("/tmp/bqrTxt.png");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

II. 其餘

1. 一灰灰Bloghttps://liuyueyi.github.io/he...

一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛

2. 聲明

盡信書則不如,以上內容,純屬一家之言,因我的能力有限,不免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激

3. 掃描關注

一灰灰blog

QrCode

相關文章
相關標籤/搜索