java后台生成Base64二维码-程序员宅基地

技术标签: java  

  直接上代码

引入依赖

<dependency>
			<groupId>com.google.zxing</groupId>
			<artifactId>javase</artifactId>
			<version>3.2.1</version>
		</dependency>

实现方法 

	// 创建二维码  content为二维码内容 width,height是二维码大小
	public static String crateB64QRCode(String content, int width, int height) {

		String resultImage = "";
		if (!StringUtils.isEmpty(content)) {
			ServletOutputStream stream = null;
			ByteArrayOutputStream os = new ByteArrayOutputStream();
			@SuppressWarnings("rawtypes")
			HashMap<EncodeHintType, Comparable> hints = new HashMap<>();
			hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 指定字符编码为“utf-8”
			hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); // 指定二维码的纠错等级为中级
			hints.put(EncodeHintType.MARGIN, 2); // 设置图片的边距

			try {
				QRCodeWriter writer = new QRCodeWriter();
				BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);

				BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
				ImageIO.write(bufferedImage, "png", os);
				/**
				 * 原生转码前面没有 data:image/png;base64 这些字段,返回给前端是无法被解析,可以让前端加,也可以在下面加上
				 */
				resultImage = new String("data:image/png;base64," + Base64.encodeBase64String(os.toByteArray()));
				return resultImage;
			} catch (Exception e) {
				logger.info("二维码生成异常:" + e.getMessage());
			} finally {
				if (stream != null) {
					try {
						stream.flush();
						stream.close();
					} catch (IOException e) {
						logger.info("servlet输出流关闭异常:" + e.getMessage());
					}

				}
			}
		}
		return resultImage;
	}

man方法调用

public static void main(String[] args)  {
		String qr=crateB64QRCode("https://www.baidu.com", 200, 200);
	System.out.println(qr);
}

运行结果

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIAQAAAACFI5MzAAABGElEQVR42u2YQRLCIAxF0xXH4KYFbsoxWIE/CaW16tZkUUYdzHPxpySfP9L4teghD/kzyYQVc6ipxdL4y+aGFLy5FrHB56w4IY02IV2EZ4reCDY9sHyHBGeu2n0ROW1IzuFrH1gSnZKizfhlfizJXKgF0fvhO4akjEoifMJ2cRdrgkIadZNHuwf+VXJDOs8H9FaUsdnD6kQPZFqLGHPdz060J7ATCNfCfYKtyZyMdnTiqMkNWSmAWLvYsxtSpPtkVmDMOO3rXWJPksSToZbc1gTbE138RGV2iydyps4xZr5zQzQF5OOuKOLQXoimzikf0B3JfNPKyx9Zo/zuLtZEUycdkpsjMlOnXLnoxx7uidiQPP8fPMSevAA6vfI0CIVIDwAAAABJRU5ErkJggg==
 

 

放入img标签

如图

 

扫码后转到百度,

这种编码图片不可以加文字和水印,可以下载,但是给图片重命名下载后是损坏的,也许是我的方法有问题,展示还是可以的啦

如果出现下面异常:

java.lang.InternalError: java.lang.reflect.InvocationTargetException
	at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:86)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
	at 

请尝试在tomcat的bin目录下 catalina.sh

添加

JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true"

保存重启 tomcat

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xx_luoli/article/details/103911067

智能推荐

GY906 MLX90614 非接触式 红外测温传感器 LabVIEW i2c总线数据读取-程序员宅基地

文章浏览阅读5.3k次。GY906使用的红外测温芯片为MLX90614。使用LabVIEW读取i2c总线数据时,需要知道传感器的地址,出厂默认为0x5A。传感器地址支持自己修改,存放在芯片EEPROM的0x0E位置,可以通过访问EEPROM的0x0E单元来获得传感器的地址。具体修改和访问EEPROM参考链接:ARDUINO使用MLX90614红外温度传感器研究笔记_雨田大大的专栏-程序员宅基地_mlx90614红外传感器工作原理使用LabVIEW中封装好的I2C express vi可以对传感器的I2C总线进行访问_labview i2c

这些学习方法等于瞎忙-程序员宅基地

文章浏览阅读602次,点赞22次,收藏17次。任何不加验证的知识和经验都是一种空泛的存在,因为我们不掌握这些知识和经验可以使用或不可以使用的环境特征,就极容易导致关键时刻使用相关知识和经验造成严重后果,同时也会影响我们的使用积极性,所以我们所学知识、技能和经验的验证和学习本身一样重要。不注重学习的系统性、方向性和自身所处阶段的结合,投入时间去学习自身所能涉猎的任何内容,对所学学科不做阶段性规划,同一时期在学不同学科的内容,随手拿来就学,这样的学习方法无法避免知识体系之间互相的干扰和破坏,更不利于解决系统性问题。第七种、学习的过程中没有积累。

大数据运维实战第十二课 Hadoop 分布式资源管理器 Yarn、MR 运行机制剖析_yarn rmadmin-程序员宅基地

文章浏览阅读776次,点赞2次,收藏4次。本课时主要讲解了分布式资源管理器 Yarn、MR 运行机制,以及 Yarn 相关的 shell 命令,对于 Yarn 资源运行机制的了解有助于对 Hadoop 集群进行调优和故障排查,这部分内容非常重要,要求我们能熟练掌握。......_yarn rmadmin

IDEA-Tomcat-源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示_idea源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。-程序员宅基地

文章浏览阅读6.4w次,点赞36次,收藏104次。IDEA-Tomcat-源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示1起因2经过3说白了1起因在学习springMVC的过程中,写了一个demo需要部署到本地Tomcat上来运行(直接使用IDEA配置本地tomcat,不用再手动发war包到tomcat目录下)。因为之前用SpringBoot项目比较多(集成了Tomcat,不需要额外部署设置;也不需要额外配好多xml),所以这部分可以说是从0学起,踩了好多坑。出现上面“源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源_idea源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。

CAPL通用函数整理---记录_capl控件-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏45次。ltoa | 整型转字符串,第三个参数选择转换出来的进制类型,2:二进制,10:十进制,16:十六进制 | long z = 255;|_gcvt |浮点数转字符串 | char s1[15];|_atoi64 | 64字节的字符串转为整形 | int i64 = _atoi64("4564616546516");| diagSendResponse | 用于发送诊断响应给诊断仪,仅用于ECU仿真节点时|_capl控件

【数据结构/C语言版】【栈】链式存储_operandtype在数据结构-程序员宅基地

文章浏览阅读72次。链式#include<iostream>using namespace std;#define SElemType char#define Status inttypedef char OperandType;typedef struct SNode { SElemType data; SNode* next;}SNode, * LinkStack;Status InitStack(LinkStack& S){ S = (LinkStack)malloc(_operandtype在数据结构

随便推点

MySQL数据库索引介绍_主键索引创建格式-程序员宅基地

文章浏览阅读1.1k次,点赞24次,收藏21次。索引就是一种帮助系统更快查找信息数据的集合表。索引是一个排序的列表,储着索引的值和包含这个值的数据所在行的物理地址无需全表扫描,访问相应的数据,能加快数据库的查询速度索引是表中一列或者若干列值排序的方法需要额外的磁盘空间普通索引是最基本的索引类型,它没有唯一性限制,允许列中存在重复的值。唯一索引要求索引列的值是唯一的,不允许重复值。唯一索引允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。_主键索引创建格式

2008-1-14 《软件工程》课后习题解答...-程序员宅基地

文章浏览阅读1.3w次,点赞9次,收藏62次。第一章 概述1.软件产品的特性是什么? a.软件产品是一种逻辑产品。 b.软件产品的生产主是研制,软件产品的成本主要体现在软件的开发和研制上,软件开发完成后,复制就产生了大量软件产品。 c.软件产品不会用坏,不存在磨损、消耗问题。 d.软件产品的生产主要是脑力劳动,还未完全摆脱手工开发方式,而且碰分是"定做"的。 e.软件费用不断增加,成本相当昂贵。2...._某厂对部分员工重新分配工作的政策是

Teamcenter二次开发介绍及资料_teamcenter soa二次开发-程序员宅基地

文章浏览阅读4k次。1、RCP客户端开发Teamcenter客户化RCP二次开发2、SOA集成开发Teamcenter客户化SOA二次开发3、ITK服务端开发Teamcenter客户化ITK二次开发4、UtilityTeamcenter客户化Utility二次开发5、AWCTeamcenter客户化AWC二次开发6、系统集成Teamcenter客户化之系统集成7、RCP,ITK及SOA二次..._teamcenter soa二次开发

基于单片机的智能控制家电开关系统的设计和实现_基于单片机的智能家电控制系统设计-程序员宅基地

文章浏览阅读1.3k次,点赞35次,收藏25次。本文首先介绍了单片机的原理和基本分类,之后分析了智能控制系统中单片机的实际应用,最后提出Wi-Fi模式和蓝牙模式的单片机智能控制家电开关系统,以此来达到智能控制家用电器的目的,为互联网智能控制体系的完善提供了有效保障。智能家居控制领域中单片机发挥着非常重要的作用,具有较为广泛的应用前景,在智能控制系统中,单片机的出现不仅实现了产品设计的优化,并且提高了效率和质量,因此文章基于单片机重点阐述了智能控制家电开关系统的具体设计,为现代人生活便捷提供有效保障。_基于单片机的智能家电控制系统设计

Vue封装websocket_vue websocket封装-程序员宅基地

文章浏览阅读4.6k次,点赞4次,收藏21次。Vue封装websocket_vue websocket封装

Unity拓展编辑器 一键导出图集工具_spritepath-程序员宅基地

文章浏览阅读1.4k次。在项目开发过程中我们必不可少的会将美术给的资源打包成图集来降低drawcall,减少包内存。为了方便的生成图集,以及生成图片路径配置来方便通过图片名称快速定位所在的图集以及图片位置。_spritepath

推荐文章

热门文章

相关标签