世界上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);

如果你从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.java

2.3.1 获取背景

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

InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(config.getBgFile());
File bgFile = Files.createTempFile("bg_", ".jpg").toFile();
FileUtils.copyInputStreamToFile(inputStream, bgFile);

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();
}

通过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;}}

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);}
}

好了,源码就先介绍到这喽。


你是那25%中的一个吗?如果你想终结拖延症,那么可以扫描下方二维码关注我哦(好像这广告语写得不怎么漂亮)。

Java生成名片式的二维码源码分享相关推荐

  1. java生成以及解析二维码

    java生成以及解析二维码 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 ...

  2. Java生成和解析二维码工具类(简单经典)

    Java生成和解析二维码工具类 开箱即用,简单不废话. pom.xml引入依赖 <!-- https://mvnrepository.com/artifact/com.google.zxing/ ...

  3. java计算机毕业设计校园二手书交易系统源码+系统+数据库+lw文档+mybatis+运行部署

    java计算机毕业设计校园二手书交易系统源码+系统+数据库+lw文档+mybatis+运行部署 java计算机毕业设计校园二手书交易系统源码+系统+数据库+lw文档+mybatis+运行部署 本源码技 ...

  4. java生成和识别二维码

    全栈工程师开发手册 (作者:栾鹏) java教程全解 本文使用两种方式生成和识别二维码. 方法1:使用日本公司的qrcode 需要引入的包 qrcode_swetake.jar qrcode.jar ...

  5. Java生成与解析二维码

    1.下载支持二维码的jar包qrcode.jar和qrcode_swetake.jar, 其中qrcode_swetake.jar用于生成二维码,rcode.jar用于解析二维码,jar包下载地址(免 ...

  6. 用 Java 生成和识别二维码就这么简单

    大家好,我是青空. 青空最近一直在思考一个问题,Java 能不能做一些比较有意思的事情,但是在网络上搜索的时候,有意思好玩的东西,都被 Python 给做了.Java 似乎就只剩下八股文,面试,框架, ...

  7. java生成两种二维码

    引言 在这篇博客中关于二维码的基本原理先不做介绍,先介绍我们怎样利用java语言实现二维码的生成,现在二维 码在我们生活中已经非常常见了,一言不合就扫码!所以对于我们这帮程序猿来说,需要研究一把这个东 ...

  8. 用java生成一个表白二维码

    之前对二维码粗略的看了一下觉得可以自己实现一个二维码用来表白,程序员的浪漫. 其实生成一个二维码非常简单几个类就可以搞定 import java.io.File; import java.nio.fi ...

  9. Java生成和解析二维码

    前言:曾经有做过不少微信公众号和移动网站的项目,对二维码还算有点了解,刚收到这个任务的时候就想着竟然要用二维码存文本,那就得先考究一下这小小的二维码到底能存多少的东西了. 需求:使用二维码存放文本(x ...

最新文章

  1. MyBatis复习笔记2:配置文件详解
  2. 提高oracle查询效率
  3. A problem occurred evaluating project ':'. ASCII
  4. python函数中可变参数的传递方式是_Python中函数的参数传递与可变长参数
  5. 悬浮框_纯HTML实现某宝优惠券、商品列表和活动悬浮等布局(文末有源码)
  6. 深入理解nodejs中的异步编程
  7. ntfs for mac使用注意事项有哪些?
  8. 局域网打印机反应慢_为什么你的Excel这么慢,这些原因必须要知道!
  9. I/O(输入/输出)---序列化与反序列化
  10. java excel 取值_java实现Excel 单元格取值工具类
  11. Silverlight for Windows Phone 开发学习笔记(-)
  12. Ubuntu18.04下NVIDIA CUDA安装指南和DeepLearning4J GPU配置
  13. servletconfigservletcontext
  14. swiper教程--swiper的基础使用(二十)
  15. 自由职业者互联网进化记
  16. Backtrader简单均线交易策略“金叉和死叉”
  17. 游戏视频录制用什么软件?这2款软件,用过都说好
  18. vue : 无法加载文件 C:\Users\xxx\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本
  19. SpringBoot+MyBatis+MySql实现的医院管理系统
  20. 大学要考的证书英语计算机,大学里必考的证书盘点 英语四六级、计算机证书上榜...

热门文章

  1. 国家、省、市三级联动下拉列表
  2. 2016年最新高效的60个网络推广方法汇总
  3. OpenMMLab简介
  4. Kibana 快速入门教程
  5. 网上期货开户合约签署流程
  6. 计算机怎么不休眠,怎么设置电脑不休眠?
  7. Gin框架组合(Zap、lumberjack、ini)使用手册
  8. 2022年2月计划(osgearth源码调试+ue4视频+ogreMain源码抄写)
  9. 暗影格斗3显示无服务器,暗影格斗3总是显示无法连接网络
  10. 算法导论第八章思考题