Quick-Media 中文二維碼支持
Quick-Media 項目提供了一些列多媒體操做的開箱即用工具類,好比圖片編輯合成,markdown/html/svg渲染,音頻處理;固然還有本文重點說明的二維碼生成解析html
QrCode-Plugin支持豐富的酷炫二維碼生成,大概十來天前有個小夥伴提了一個很是有意思的方向,可否將二維碼中的黑白方塊換成中文java
趁着端午放假前夕的空閒時間,把這個集成在QrCode插件中,生成效果以下(從左往右,從上往下讀,千字文?)git
<!-- more -->github
對於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>
對於源碼的使用方式就比較簡單了,下載源碼,直接在test目錄下編寫測試case便可maven
源碼地址: Quick-Mediasvg
先來看一下,如何生成文字二維碼,一個最簡單的使用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(); } }
除了上面這種文字方式以外,還有一種以下圖的這種,二維碼顯示一個字的狀況
上面這個二維碼,主要是藉助背景圖的渲染方式來實現,背景圖上爲一張淺灰底色,紅字,二維碼採用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(); } }
一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛
盡信書則不如,以上內容,純屬一家之言,因我的能力有限,不免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
一灰灰blog