Java產生名片式的二維碼源碼分享

來源:互聯網
上載者:User

標籤:wim   current   諺語   blog   clip   dash   except   load   star   

世界上25%的人都有拖延症——但我覺得這統計肯定少了,至少我就是一名拖延症患者。一直想把“Java產生名片式(帶有背景圖片、使用者網路頭像、使用者暱稱)的二維碼”這篇部落格分享出來,但一直拖啊拖,拖到現在,真應了蘇格蘭的那句諺語——“什麼時候都能做的事,往往什麼時候都不會去做。”

零、

  1. 左上方為頭像。
  2. 沉默王二是文字暱稱。
  3. 附帶URL為http://blog.csdn.net/qing_gee的二維碼
  4. 還有指定的背景圖。

使用情境:

點公眾號的菜單“我的二維碼”,然後展示一張名片式的二維碼給使用者。

一、源碼下載

可以通過GitHub直接下載https://github.com/qinggee/qrcode-utils.

二、源碼介紹

你肯定在網路上見到過不少Java產生帶有logo的二維碼的源碼,這些都是產生二維碼的初級應用。相對來說,產生“名片式(帶有背景圖片、使用者網路頭像、使用者名稱稱的二維碼圖片)的二維碼”可能更進階一點,但內在的原理其實是相似的——在一張指定的圖片對象Graphics2D利用drawImage()方法繪製上層映像,利用drawString繪製文字。

2.1 使用介面

檔案位置: /qrcode-utils/src/test/QrcodeUtilsTest.java

MatrixToBgImageConfig config = new MatrixToBgImageConfig();// 網路頭像地址       config.setHeadimgUrl("https://avatars2.githubusercontent.com/u/6011374?v=4&u=7672049c1213f7663b79583d727e95ee739010ec&s=400");// 二維碼地址,掃描二維碼跳轉的地址config.setQrcode_url("http://blog.csdn.net/qing_gee");// 二維碼名片上的名字config.setRealname("沉默王二");// 通過QrcodeUtils.createQrcode()產生二維碼的位元組碼byte[] bytes = QrcodeUtils.createQrcode(config);// 二維碼產生路徑Path path = Files.createTempFile("qrcode_with_bg_", ".jpg");// 寫入到檔案Files.write(path, bytes);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

如果你從GitHub上下載到源碼後,可直接通過eclipse把工程匯入到你的工作庫,運行/qrcode-utils/src/test/QrcodeUtilsTest.java 即可產生二維碼。

2.2 目錄檔案介紹

  1. 核心類為QrcodeUtils.java(用來產生二維碼)
  2. 名片式二維碼的參數類MatrixToBgImageConfig.java
  3. 測試案例QrcodeUtilsTest.java
  4. res資源套件下有兩張圖片,bg.jpg為指定的背景圖、default_headimg.jpg為預設的頭像圖
  5. /qrcode-utils/lib為所需的jar包
2.3 QrcodeUtils.java2.3.1 擷取背景

注意以下代碼中的第一行代碼。

InputStream inputStream = Thread.currentThread().getContextClassLoader()                    .getResourceAsStream(config.getBgFile());File bgFile = Files.createTempFile("bg_", ".jpg").toFile();FileUtils.copyInputStreamToFile(inputStream, bgFile);
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
2.3.2 擷取頭像

通過建立HttpGet請求來擷取頭像。

CloseableHttpClient httpclient = HttpClientBuilder.create().build();HttpGet httpget = new HttpGet(config.getHeadimgUrl());httpget.addHeader("Content-Type", "text/html;charset=UTF-8");// 配置請求的逾時設定RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(500)        .setConnectTimeout(500).setSocketTimeout(500).build();httpget.setConfig(requestConfig);try (CloseableHttpResponse response = httpclient.execute(httpget);        InputStream headimgStream = handleResponse(response);) {    Header[] contentTypeHeader = response.getHeaders("Content-Type");    if (contentTypeHeader != null && contentTypeHeader.length > 0) {        if (contentTypeHeader[0].getValue().startsWith(ContentType.APPLICATION_JSON.getMimeType())) {            // application/json; encoding=utf-8 下載媒體檔案出錯            String responseContent = handleUTF8Response(response);            logger.warn("下載網路頭像出錯{}", responseContent);        }    }    headimgFile = createTmpFile(headimgStream, "headimg_" + UUID.randomUUID(), "jpg");} catch (Exception e) {    logger.error(e.getMessage(), e);    throw new Exception("頭像檔案讀取有誤!", e);} finally {    httpget.releaseConnection();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

通過createTmpFile方法將映像下載到本地。

public static File createTmpFile(InputStream inputStream, String name, String ext) throws IOException {        File tmpFile = File.createTempFile(name, ‘.‘ + ext);        tmpFile.deleteOnExit();        try (FileOutputStream fos = new FileOutputStream(tmpFile)) {            int read = 0;            byte[] bytes = new byte[1024 * 100];            while ((read = inputStream.read(bytes)) != -1) {                fos.write(bytes, 0, read);            }            fos.flush();            return tmpFile;        }    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
2.3.3 在背景圖上繪製二維碼、頭像、暱稱
private static void increasingImage(BufferedImage image, String format, String imagePath, File bgFile,        MatrixToBgImageConfig config, File headimgFile) throws Exception {    try {        BufferedImage bg = ImageIO.read(bgFile);        Graphics2D g = bg.createGraphics();        // 二維碼的高度和寬度如何定義        int width = config.getQrcode_height();        int height = config.getQrcode_height();        // logo起始位置,此目的是為logo置中顯示        int x = config.getQrcode_x();        int y = config.getQrcode_y();        // 繪製圖        g.drawImage(image, x, y, width, height, null);        BufferedImage headimg = ImageIO.read(headimgFile);        int headimg_width = config.getHeadimg_height();        int headimg_height = config.getHeadimg_height();        int headimg_x = config.getHeadimg_x();        int headimg_y = config.getHeadimg_y();        // 繪製頭像        g.drawImage(headimg, headimg_x, headimg_y, headimg_width, headimg_height, null);        // 繪製文字        g.setColor(Color.GRAY);// 文字顏色        Font font = new Font("宋體", Font.BOLD, 28);        g.setFont(font);        g.drawString(config.getRealname(), config.getRealname_x(), config.getRealname_y());        g.dispose();        // 寫入二維碼到bg圖片        ImageIO.write(bg, format, new File(imagePath));    } catch (Exception e) {        throw new Exception("二維碼添加bg時發生異常!", e);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

好了,源碼就先介紹到這嘍。

 

http://blog.csdn.net/qing_gee/article/details/77341821

Java產生名片式的二維碼源碼分享

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.