這一篇文章我們就用 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();
在指定的臨時目錄下可以檢視采集到的圖檔,如下所示。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SN2QWYyIWNzIzNhRzNyImYygjN0ETZ1ETOjRGZ5AzNk9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
03、加載海報背景和個人品牌二維碼
海報背景的大小為 678 * 1013 像素,個人品牌二維碼的大小為 128 * 128 像素。兩張圖檔都是事先準備好的,放在 src 目錄下。整個項目的目錄結構圖如下所示。
接下來,我們把這兩張圖檔分别讀取到臨時檔案當中,供後續動作使用。
第一步,建立 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());
在指定的臨時目錄下可以檢視海報背景和個人品牌二維碼,如下所示。