1. 程式人生 > 程式設計 >Java生成藝術二維碼也可以很簡單

Java生成藝術二維碼也可以很簡單

原文點選: Quick-Media Java生成藝術二維碼也可以很簡單

現在二維碼可以說非常常見了,當然我們見得多的一般是白底黑塊,有的再中間加一個 logo,或者將二維碼嵌在一張特定的背景中(比如微信、支付寶的收款碼);偶爾也可能看到一些酷炫的二維碼,比如非黑白的、漸變色的、非方塊樣式的,或者說是動態的二維碼

那麼問題來了,走位一個 java 開發者而言,有沒有什麼開源庫,可以簡單迅速不燒腦的實現各種炫酷的二維碼呢?

接下來我們將介紹下,如何藉助 github.com/liuyueyi/qu… 專案的 qrcode-plugin 來生成各種酷炫的二維碼

1. 配置

我們主要使用的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> 複製程式碼

新增依賴之後,我們就可以愉快的玩耍了

2. 例項演示

接下來我們通過一系列的例項程式碼,來演示如何生成各種酷炫的二維碼

a. 基本二維碼

生成一個最常見的最普通的二維碼,並儲存到qr.png檔案,一行程式碼即可

String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH"
; // 生成二維碼,並輸出為qr.png圖片 boolean ans = QrCodeGenWrapper.of(msg).asFile("qr.png"); 複製程式碼

dq.png

b. 顏色指定

預設的二維碼為白底黑塊,如果我希望生成白底藍塊(探測圖形外青內紅)的二維碼,可以如下使用

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");
複製程式碼

cqr.png

c. 帶 logo 二維碼生成

logo 目前支援兩種樣式,一個是圓角 logo,一個是直接原圖不做處理;下面是一個簡單的圓角 logo,並帶上邊框的例項

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 的二維碼

  • 原始 logo
  • 直角帶 logo 背景色
  • 圓角帶 logo 背景色
  • 圓角帶 logo 背景,邊框

logo

d. 指定背景圖

背景圖目前支援三種樣式,分別是二維碼全覆蓋在背景圖上,在背景圖的自定區間進行繪製二維碼,生成透明二維碼但使用背景圖進行渲染,下面

// 預設屬於全覆蓋的背景模式,對應下圖中左圖
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");
複製程式碼

bqr

e. 幾何樣式二維碼生成

預設的二維碼的資訊為黑色小方塊,本外掛提供了其他的幾個常見的幾何形式支援,如圓點,三角,鑽石,六邊形,八邊形;通過指定 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");
複製程式碼

幾何

f. 圖片填充

如果你有一套完整的素材,那麼可以考慮用這些素材來生成一個更漂亮的二維碼;

比如專案的測試中,給出了兩套輸出,一個愛心,一個集合圖形

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,"jihe/b.png")
        .addImg(1,3,"jihe/c.png")
        .addImg(3,2,"jihe/e.png")
        .addImg(2,"jihe/f.png")
        .addImg(2,"jihe/g.png")
        .addImg(3,4,"jihe/h.png")
        .setPicType("png")
        .asFile("/tmp/imgQr1.png");
複製程式碼

使用這種方式,需要稍微注意一下

  • 必須制定 DrawStyle 為圖片模式
  • addImg(row,column,img) 來宣告素材對應的應用場景,這個表示當出現一個 row 行,column 列都有資訊時,用 img 來填充

下面是一個是 quick-media 提供的兩種樣式模板

imgQr

g. 動態二維碼

接下來介紹一下動態二維碼的生成,和背景圖的使用姿勢基本上完全以往,唯一的區別就是背景圖為 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");
複製程式碼

list.gif

h. 綜合

上面的幾種 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,"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");
複製程式碼

求關注

II. 其他

1. 一灰灰 Blogliuyueyi.github.io/hexblog

一灰灰的個人部落格,記錄所有學習和工作中的博文,歡迎大家前去逛逛

2. 宣告

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

3. 掃描關注

一灰灰 blog

QrCode