Quick-Media 項目提供了一些列多媒體操作的開箱即用工具類,比如圖片編輯合成,markdown/html/svg渲染,音頻處理;當然還有本文重點說明的二維碼生成解析
QrCode-Plugin支持豐富的酷炫二維碼生成,大概十來天前有個小夥伴提了一個非常有意思的方向,能否將二維碼中的黑白方塊換成中文
趁着端午放假前夕的空閒時間,把這個集成在QrCode插件中,生成效果如下(從左往右,從上往下讀,千字文😝)
I. 使用說明
1. maven導入
對於java環境的小夥伴,可以藉助maven引入依賴包
<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
導入依賴也是可以的
<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即可
源碼地址: Quick-Media
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. 一灰灰Blog: https://liuyueyi.github.io/hexblog
一灰灰的個人博客,記錄所有學習和工作中的博文,歡迎大家前去逛逛
2. 聲明
盡信書則不如,以上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
3. 掃描關注
一灰灰blog