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

简介: 版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/77341821 世界上25%的人都有拖延症——但我觉得这统计肯定少了,至少我就是一名拖延症患者。
版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/77341821

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

沉默王二

相关文章
|
3月前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
93 7
|
4月前
|
数据采集 人工智能 Java
Java产科专科电子病历系统源码
产科专科电子病历系统,全结构化设计,实现产科专科电子病历与院内HIS、LIS、PACS信息系统、区域妇幼信息平台的三级互联互通,系统由门诊系统、住院系统、数据统计模块三部分组成,它管理了孕妇从怀孕开始到生产结束42天一系列医院保健服务信息。
69 4
|
4月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
145 2
|
7天前
|
前端开发 JavaScript Java
[Java计算机毕设]基于ssm的OA办公管理系统的设计与实现,附源码+数据库+论文+开题,包安装调试
OA办公管理系统是一款基于Java和SSM框架开发的B/S架构应用,适用于Windows系统。项目包含管理员、项目管理人员和普通用户三种角色,分别负责系统管理、请假审批、图书借阅等日常办公事务。系统使用Vue、HTML、JavaScript、CSS和LayUI构建前端,后端采用SSM框架,数据库为MySQL,共24张表。提供完整演示视频和详细文档截图,支持远程安装调试,确保顺利运行。
49 17
|
14天前
|
Java 调度
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
82 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
|
1月前
|
JavaScript 安全 Java
智慧产科一体化管理平台源码,基于Java,Vue,ElementUI技术开发,二开快捷
智慧产科一体化管理平台覆盖从备孕到产后42天的全流程管理,构建科室协同、医患沟通及智能设备互联平台。通过移动端扫码建卡、自助报道、智能采集数据等手段优化就诊流程,提升孕妇就诊体验,并实现高危孕产妇五色管理和孕妇学校三位一体化管理,全面提升妇幼健康宣教质量。
48 12
|
1天前
|
JavaScript Java Docker
干货含源码!如何用Java后端操作Docker(命令行篇)
只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
1月前
|
人工智能 监控 安全
Java智慧工地(源码):数字化管理提升施工安全与质量
随着科技的发展,智慧工地已成为建筑行业转型升级的重要手段。依托智能感知设备和云物互联技术,智慧工地为工程管理带来了革命性的变革,实现了项目管理的简单化、远程化和智能化。
40 5
|
9天前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
|
2月前
|
JavaScript Java 测试技术
基于Java+SpringBoot+Vue实现的车辆充电桩系统设计与实现(系统源码+文档+部署讲解等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!

热门文章

最新文章