世界上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.java

2.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生成名片式的二维码源码分享的更多相关文章

  1. Java生成与解析二维码

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

  2. Java生成、解析二维码

    今天遇到需求,使用Java生成二维码图片,网搜之后,大神们早就做过,个人总结一下. 目标:借助Google提供的ZXing Core工具包,使用Java语言实现二维码的生成和解析. 步骤如下: 1.m ...

  3. java生成和解析二维码

    前言 现在,二维码的应用已经非常广泛,在线生成器也是诸多,随手生成. 所以就和大家分享一个小案例,用zxing来做一个的二维码生成器,当然这个例子是比较简单,若是写的不好请多多包涵. ZXING项目是 ...

  4. 使用Google提供的ZXing Core,Java生成、解析二维码

    1.maven项目中,pom.xml中引入ZXing Core工具包: <!-- https://mvnrepository.com/artifact/com.google.zxing/core ...

  5. java 生成微信的二维码 工具类

    package com.app.wii.util; import java.io.File;import java.io.FileInputStream;import java.io.FileOutp ...

  6. java 生成和解析二维码

    public class QRCode { /** * 解析二维码(QRCode) * @param imgPath * @return */ public static String decoder ...

  7. Java生成带logo二维码

    目前生成二维码的方式有很多种,本例采用谷歌的zxing,去白边,添加logo等处理均在代码中有注释 demo连接 https://github.com/littlechaser/qrcode.git

  8. QR二维码生成器源码(中间可插入小图片)

    二维码终于火了,现在大街小巷大小商品广告上的二维码标签都随处可见,而且大都不是简单的纯二维码,而是中间有个性图标的二维码. 我之前做了一个使用google开源项目zxing实现二维码.一维码编码解码的 ...

  9. Java集合框架之二:LinkedList源码解析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! LinkedList底层是通过双向循环链表来实现的,其结构如下图所示: 链表的组成元素我们称之为节点,节点由三部分组成:前一个节点的引用地 ...

随机推荐

  1. 增量会话对象——DeltaSession

    在集群环境中为了使集群中各个节点的会话状态都同步,同步操作是集群重点解决的问题,一般来说有两种同步策略,其一是每次同步都把整个会话对象传给集群中其他节点,其他节点更新整个会话对象:其二是对会话中增量修 ...

  2. LAV Filter 源代码分析 3: LAV Video (1)

    LAV Video 是使用很广泛的DirectShow Filter.它封装了FFMPEG中的libavcodec,支持十分广泛的视频格式的解码.在这里对其源代码进行详细的分析. LAV Video ...

  3. OpenCV——PS滤镜,毛玻璃特效

    程序完成 "毛玻璃" 特效, 不过边缘没有处理,使得最终的图像有黑边. 不过,有了黑边,感觉效果也不错,所以这个bug 没有管. #ifndef PS_ALGORITHM_H_IN ...

  4. iwms后台出现从客户端(ctl00$cphMain$logo="<img src="pic/logo.g...")中检测到有潜在危险的 Request.Form 值。错误解决方法

    请将 web.config 文件中httpRuntime 配置节中的 requestValidationMode 特性设置为 requestValidationMode="2.0" ...

  5. SQL Queries and Multi-Org Architecture in Release 12

    In this Document   Abstract   History   Details   Previous Releases   Release 12   Multi-Org Session ...

  6. EBS R12安装升级(FRESH)(二)

    3 Linux系统设置 这一节步骤基本都在终端root用户下进行. 自行熟悉vi或其他文本工具的用法. 3.1 host-only外网连接 如果用的NAT模式这一节略过. 右击当前主机连接外网的网卡, ...

  7. java基础Haep(堆)和Stack(栈)区别

    简单的可以理解为: heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的.  stack:是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 注:何为高地址 ...

  8. linux下创建且挂载光盘镜像

    在linux下可以很方便的将多个文件,或多个文件夹下的内容打包进光盘镜像中,我们可以用: mkisofs -r -v -o xxx.iso /root /home 命令将/root以及/home目录下 ...

  9. React Native入门 认识Flexbox布局

    Flexbox布局是由W3C在09年提出的在Web端取代CSS盒子模型的一种布局方式. ReactNative实现了Flexbox布局的大部分功能. Flexbox布局所使用的属性,基本可以分为两大类 ...

  10. MATLAB坐标系中绘制图片

    MATLAB坐标系中绘制图片 方法一 使用图片坐标循环的方式,代码如下. clear,clc,close all tic; map=imbinarize(imread('map.bmp'));%map ...