Java生成名片式的二维码源码分享

原创 2017年08月17日 22:33:03

世界上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%中的一个吗?如果你想终结拖延症,那么可以扫描下方二维码关注我哦(好像这广告语写得不怎么漂亮)。

沉默王二

版权声明:本文出自沉默王二的博客,转载必须注明出处。技术交流群 120926808

二维码相关---java生成二维码名片,并且自动保存到手机通讯录中...

二维码相关---java生成二维码名片,并且自动保存到手机通讯录中... 1.首先介绍一个api.   Zxing是Google提供的关于条码   (一维码、二维码)的解析工具,提供了二维码的生成与解...
  • lidew521
  • lidew521
  • 2014年04月25日 00:20
  • 11047

java动态生成名片画图工具

public class ChartGraphics { private static BufferedImage image; //图片的宽度 private static ...
  • qq_39046217
  • qq_39046217
  • 2017年12月27日 11:19
  • 60

javaWeb实现二维码名片生成

  • 2016年01月21日 15:12
  • 795KB
  • 下载

java 二维码原理以及用java实现的二维码的生成、解码

QR码生成原理(一) 一、什么是QR码 QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化。QR码的样子其实在很多场合已经能够被看到了,我这还...
  • hanmengaidudu
  • hanmengaidudu
  • 2016年05月21日 09:31
  • 4920

实现仿简书选取内容生成分享图片效果

前几天脑子里忽然闪过简书的图片分享效果,感觉很简洁也很漂亮,想着能不能用自己方式实现一下呢,于是今天就有了这篇文章。好了,先看下效果图吧:项目地址: https://github.com/zhang...
  • zhangke3016
  • zhangke3016
  • 2016年09月23日 19:48
  • 1387

Java 实现HTML 页面转成image 图片

前言 在java 中把HTML转化成图档,思路基本上是现在 AWT or Swing 的Panel上显示网页,在把Panel输出为 image 文件。 java 本身的API有提供相关的结果,...
  • oscar999
  • oscar999
  • 2013年03月20日 16:05
  • 19240

二维码名片的格式 - vcard

二维码名片的格式 - vcard如果你希望生成的二维码名片可以被智能设备识别,并可以直接导入到通讯录中,那么就应遵循某种标准格式。常见的是生成vcard标准格式。一个简单的vcard名片格式例子参考如...
  • johnsuna
  • johnsuna
  • 2013年01月08日 18:05
  • 20987

C#生成二维码名片

本例将使用ThoughtWorks.QRCode类库生成二维码名片。正式编码前,先了解一下什么是vCard?它是一种用于定义电子名片的标准或规范。手机通信录可导出vCard格式。片段21-15是一段v...
  • daiqianjie
  • daiqianjie
  • 2016年07月19日 21:16
  • 1607

制作符合vCard标准的二维码QR Code名片

很多人在日常工作中需要用到名片,并在名片上包含各种关于自己的信息。但这就有一个问题,对于非常繁忙的人,如果一次商务活动收到太多名片,这些名片的电子化过程往往非常麻烦。例如,用人工的方式将所有名片包含的...
  • hupuxiang
  • hupuxiang
  • 2012年03月17日 13:19
  • 1959

30分钟做一个二维码名片应用,有源码!

前言     30分钟带你用Wex5做一个微信公众号上使用的二维码名片,相应技术点有详细讲解,高清有码!(点击下载全部源码)     二维码现在是无处不在,无孔不入了。大到一辆汽车,小到一...
  • ppqiaoping
  • ppqiaoping
  • 2016年07月13日 16:15
  • 2741
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java生成名片式的二维码源码分享
举报原因:
原因补充:

(最多只允许输入30个字)