这一篇文章我们就用 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();
在指定的临时目录下可以查看采集到的图片,如下所示。
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());
在指定的临时目录下可以查看海报背景和个人品牌二维码,如下所示。