天天看點

開源)Java生成二維碼分享海報(1)

這一篇文章我們就用 Java 來生成一下仿金山詞霸的海報。

As long as you can still grab a breath, you fight.

隻要一息尚存,就不得不戰。

有那麼一段時間,我特别迷戀金山詞霸的每日一句分享海報。因為不僅海報上的圖檔美,文字也特别美,美得讓我感覺生活都有了詩意。就像文章開頭的那句中英文對照,中文和英文都妙極了。

最近,又有很多人迷戀上了流利說的小程式分享海報(朋友圈比比皆是)。但不管是金山詞霸還是流利說,分享的海報都不是自己的二維碼,這對于個人品牌的締造者來說,實在是一件出力不讨好的事。

當然了,這種事難不倒作為程式員的我。

01、大緻思路

采集網絡圖檔

加載海報背景和個人品牌二維碼

利用 Graphics2D 将網絡圖檔繪制成海報封面

利用 Graphics2D 在海報上列印中英文對照語

利用 Graphics2D 在海報上繪制個人專屬二維碼

使用 Swing 建構圖形化界面

将項目打成 jar 包發行

運作 jar 包,填寫必要資訊後生成海報

02、采集網絡圖檔

第一步,擷取網絡圖檔的路徑。金山詞霸每日一句的圖檔路徑位址形式如下所示。可以根據目前日期擷取最新的圖檔路徑。

// 金山詞霸的圖檔路徑

String formatDate = DateFormatUtils.format(new Date(), "yyyyMMdd");

String picURL = "http://cdn.iciba.com/news/word/big_" + formatDate + "b.jpg";

第二步,有了圖檔路徑後,可以根據此路徑建立 HTTP get 請求。

// 根據路徑發起 HTTP get 請求
HttpGet httpget = new HttpGet(picURL);
// 使用 addHeader 方法添加請求頭部
httpget.addHeader("Content-Type", "text/html;charset=UTF-8");
// 配置請求的逾時設定
RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(500).setConnectTimeout(500)
  .setSocketTimeout(500).build();
httpget.setConfig(requestConfig);      

第三步,建立 CloseableHttpClient 對象來執行 HTTP get 請求,并擷取響應資訊 CloseableHttpResponse。CloseableHttpClient 是一個抽象類,它是 HttpClient 的基本實作,也實作了 java.io.Closeable 接口。

CloseableHttpClient httpclient = HttpClientBuilder.create().build();

CloseableHttpResponse response = httpclient.execute(httpget);

第四步,從 CloseableHttpResponse 中擷取圖檔的輸入流。

HttpEntity entity = response.getEntity();

InputStream picStream = entity.getContent();

第五步,從圖檔輸入流中讀取資訊,并輸出到本地檔案中。

File pic = Files.createTempFile(Paths.get("D:\\test"), "pic_", ".jpg");
FileOutputStream fos = new FileOutputStream(pic);
int read = 0;
// 1024Byte(位元組)=1KB 1024KB=1MB
byte[] bytes = new byte[1024 * 100];
while ((read = inputStream.read(bytes)) != -1) {
    fos.write(bytes, 0, read);
}
fos.flush();
fos.close();      

在指定的臨時目錄下可以檢視采集到的圖檔,如下所示。

開源)Java生成二維碼分享海報(1)

03、加載海報背景和個人品牌二維碼

海報背景的大小為 678 * 1013 像素,個人品牌二維碼的大小為 128 * 128 像素。兩張圖檔都是事先準備好的,放在 src 目錄下。整個項目的目錄結構圖如下所示。

開源)Java生成二維碼分享海報(1)

接下來,我們把這兩張圖檔分别讀取到臨時檔案當中,供後續動作使用。

第一步,建立 ClassLoader 對象,從 classpath 的根路徑下查找資源。

ClassLoader classLoader = ReadBgAndQrcode.class.getClassLoader();

第二步,通過 classLoader.getResourceAsStream() 讀取海報背景和個人品牌二維碼,複制到臨時檔案中。

File bgFile = Files.createTempFile(DIRECTORY, "bg_", ".jpg").toFile();
InputStream inputStream = classLoader.getResourceAsStream("default_bgimg.jpg");
FileUtils.copyInputStreamToFile(inputStream, bgFile);
logger.debug("背景:" + bgFile.getAbsolutePath());


File qrcodeFile = Files.createTempFile(DIRECTORY, "qrcode_", ".jpg").toFile();
InputStream qrcodeInputStream = classLoader.getResourceAsStream("default_qrcodeimg.jpg");
FileUtils.copyInputStreamToFile(qrcodeInputStream, qrcodeFile);
logger.debug("二維碼:" + qrcodeFile.getAbsolutePath());

      

在指定的臨時目錄下可以檢視海報背景和個人品牌二維碼,如下所示。

開源)Java生成二維碼分享海報(1)