原文點擊: Quick-Media Java生成藝術二維碼也能夠很簡單java
如今二維碼能夠說很是常見了,固然咱們見得多的通常是白底黑塊,有的再中間加一個 logo,或者將二維碼嵌在一張特定的背景中(好比微信、支付寶的收款碼);偶爾也可能看到一些酷炫的二維碼,好比非黑白的、漸變色的、非方塊樣式的,或者說是動態的二維碼git
那麼問題來了,走位一個 java 開發者而言,有沒有什麼開源庫,能夠簡單迅速不燒腦的實現各類炫酷的二維碼呢?github
接下來咱們將介紹下,如何藉助 https://github.com/liuyueyi/quick-media 項目的 qrcode-plugin
來生成各類酷炫的二維碼微信
咱們主要使用的quick-media
項目其中的一個插件:qrcode-plugin
,目前已提供 maven 的引入方式,最新版本爲2.1
網絡
<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.2</version> </dependency>
添加依賴以後,咱們就能夠愉快的玩耍了app
接下來咱們經過一系列的實例代碼,來演示如何生成各類酷炫的二維碼maven
生成一個最多見的最普通的二維碼,並保存到qr.png
文件,一行代碼便可學習
String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH"; // 生成二維碼,並輸出爲qr.png圖片 boolean ans = QrCodeGenWrapper.of(msg).asFile("qr.png");
默認的二維碼爲白底黑塊,若是我但願生成白底藍塊(探測圖形外青內紅)的二維碼,能夠以下使用測試
String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH"; boolean ans = QrCodeGenWrapper.of(msg) .setW(300) // 定位點(探測圖形)外邊顏色 .setDetectOutColor(Color.CYAN) // 定位點內部顏色 .setDetectInColor(Color.RED) // 二維碼着色點 .setDrawPreColor(Color.BLUE) // 二維碼背景圖 .setDrawBgColor(0xffffffff) .asFile("/tmp/cqr.png");
logo 目前支持兩種樣式,一個是圓角 logo,一個是直接原圖不作處理;下面是一個簡單的圓角 logo,並帶上邊框的實例ui
String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH"; // 這裏的圖片地址,支持網絡圖片,本地相對路勁圖片,本地絕對路徑圖片 String logo = "https://static.oschina.net/uploads/user/283/566591_100.jpeg"; boolean ans = QrCodeGenWrapper.of(msg) .setLogo(logo) .setLogoStyle(QrCodeOptions.LogoStyle.ROUND) .setLogoBgColor(0xfffefefe) .setLogoBorderBgColor(0xffc7c7c7) .setLogoBorder(true) .asFile("/tmp/lqr3.png");
下圖展現了四張帶 logo 的二維碼
背景圖目前支持三種樣式,分別是二維碼全覆蓋在背景圖上,在背景圖的自定區間進行繪製二維碼,生成透明二維碼但使用背景圖進行渲染,下面
// 默認屬於全覆蓋的背景模式,對應下圖中左圖 String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH"; String bg = "https://ww1.sinaimg.cn/large/8154e929gy1g8vho8x6r0j20b40b43yl.jpg"; boolean ans = QrCodeGenWrapper.of(msg) .setBgImg(bg) .setW(500) .setBgOpacity(0.5f) .asFile("/tmp/bqr1.png"); // 指定爲填充模式,在背景圖的座標(startX, startY)處繪製二維碼(左上角座標爲0,0; 對應下圖中的中圖 bg = "https://pic.51yuansu.com/pic3/cover/01/07/09/59015a0e53d83_610.jpg"; ans = QrCodeGenWrapper.of(msg) .setBgImg(bg) .setBgStyle(QrCodeOptions.BgImgStyle.FILL) .setBgW(500) .setBgH(500) .setBgStartX(130) .setBgStartY(120) .setW(260) .setPadding(0) .setDrawBgColor(0xfff7f7f7) .asFile("/tmp/bqr2.png"); // 背景渲染方式,用背景圖來填充二維碼,對應下圖中的右圖 bg = "https://img1.juimg.com/180517/355855-1P51H3520817.jpg"; ans = QrCodeGenWrapper.of(msg) .setBgImg(bg) .setBgStyle(QrCodeOptions.BgImgStyle.PENETRATE) .setBgW(500) .setBgH(500) .setW(500) .asFile("/tmp/bqr3.png");
默認的二維碼的信息爲黑色小方塊,本插件提供了其餘的幾個常見的幾何形式支持,如圓點,三角,鑽石,六邊形,八邊形;經過指定 DrawStyle 參數便可
String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH"; boolean ans = QrCodeGenWrapper.of(msg) .setW(400) // 支持將臨近相同的合併成一個大的圓點 .setDrawEnableScale(true) .setDrawStyle(QrCodeOptions.DrawStyle.CIRCLE) .asFile("/tmp/dqr6.png");
若是你有一套完整的素材,那麼能夠考慮用這些素材來生成一個更漂亮的二維碼;
好比項目的測試中,給出了兩套輸出,一個愛心,一個集合圖形
String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH"; int size = 500; boolean ans = QrCodeGenWrapper.of(msg) .setW(size) .setH(size) .setErrorCorrection(ErrorCorrectionLevel.H) // 由於素材爲png透明圖,咱們這裏設置二維碼的背景爲透明,輸出更加優雅 .setDrawBgColor(ColorUtil.OPACITY) .setDetectImg("jihe/PDP.png") .setDrawStyle(QrCodeOptions.DrawStyle.IMAGE) .addImg(1, 1, "jihe/a.png") .addImg(3, 1, "jihe/b.png") .addImg(1, 3, "jihe/c.png") .addImg(3, 2, "jihe/e.png") .addImg(2, 3, "jihe/f.png") .addImg(2, 2, "jihe/g.png") .addImg(3, 4, "jihe/h.png") .setPicType("png") .asFile("/tmp/imgQr1.png");
使用這種方式,須要稍微注意一下
addImg(row, column, img)
來聲明素材對應的應用場景,這個表示當出現一個 row 行,column 列都有信息時,用 img 來填充下面是一個是 quick-media 提供的兩種樣式模板
接下來介紹一下動態二維碼的生成,和背景圖的使用姿式基本上徹底以往,惟一的區別就是背景圖爲 gif 動圖
// 全覆蓋模式,指定二維碼的透明度(以下圖左) String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH"; String bg = "https://ww1.sinaimg.cn/large/8154e929gy1g8pq78mcgrg20dw0boaja.gif"; boolean ans = QrCodeGenWrapper.of(msg) .setW(500) .setBgImg(bg) .setBgOpacity(0.6f) .setPicType("gif") .asFile("/tmp/gifQr1.gif"); // 填充模式,在背景圖的指定位置上繪製二維碼,屬於常見的一種動圖模式(以下圖中) bg = "https://ww1.sinaimg.cn/large/8154e929gy1g8qe2iv0evg20xc0irn68.gif"; boolean ans = QrCodeGenWrapper.of(msg) .setW(400) .setBgImg(bg) .setBgStyle(QrCodeOptions.BgImgStyle.FILL) .setBgStartX(20) .setBgStartY(137) .setPicType("gif") .asFile("/tmp/gifQr2.gif"); // 背景渲染模式,直接用背景圖來填充二維碼信息,所以能夠實現炫酷的二維碼(以下圖右) bg = "https://ww1.sinaimg.cn/large/8154e929gy1g8w7wj6qvsg20oy0io4dt.gif"; boolean ans = QrCodeGenWrapper.of(msg) .setBgImg(bg) .setBgW(500) .setBgH(500) .setBgStyle(QrCodeOptions.BgImgStyle.PENETRATE) .setW(500) .asFile("/tmp/gifQr3.gif");
上面的幾種 case,是能夠組合使用的,最後給一個綜合的"求關注"動態二維碼的生成實例
String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH"; // 網絡動圖背景 String bg = "https://ww1.sinaimg.cn/large/8154e929gy1g8w9jsxwtdg20pz08zwr8.gif"; // 本地logo String logo = "logo.jpg"; boolean ans = QrCodeGenWrapper.of(msg) .setW(500) .setDrawBgColor(ColorUtil.OPACITY) .setDrawStyle(QrCodeOptions.DrawStyle.IMAGE) .setDetectImg("jihe/PDP.png") .addImg(1, 1, "jihe/a.png") .addImg(3, 1, "jihe/b.png") .addImg(1, 3, "jihe/c.png") .addImg(3, 2, "jihe/e.png") .addImg(2, 3, "jihe/f.png") .addImg(2, 2, "jihe/g.png") .addImg(3, 4, "jihe/h.png") .setPadding(1) .setErrorCorrection(ErrorCorrectionLevel.H) .setLogo(logo) .setLogoBorder(true) .setLogoStyle(QrCodeOptions.LogoStyle.ROUND) .setLogoBgColor(0xfffefefe) .setLogoBorderBgColor(0xffc7c7c7) .setBgImg(bg) .setBgW(1870) .setBgH(646) .setBgStyle(QrCodeOptions.BgImgStyle.FILL) .setBgStartX(690) .setBgStartY(20) .setBgOpacity(0.9f) .setPicType("gif") .asFile("/tmp/gifQr4.gif");
一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛
盡信書則不如,已上內容,純屬一家之言,因我的能力有限,不免有疏漏和錯誤之處,如發現 bug 或者有更好的建議,歡迎批評指正,不吝感激
一灰灰 blog