java生成二维码合并海报并加上文字

1.生成二维码

	public static byte[] generateQRCodeImages(String text, int width, int height) throws WriterException, IOException {String binary = null;QRCodeWriter qrCodeWriter = new QRCodeWriter();//调整白边大小Hashtable<EncodeHintType, Object> hints = new Hashtable<>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");hints.put(EncodeHintType.MARGIN, 1);BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height,hints);//BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);//bitMatrix = deleteWhite(bitMatrix);ByteArrayOutputStream out = new ByteArrayOutputStream();MatrixToImageWriter.writeToStream(bitMatrix,"PNG",out);byte[] byteArray = out.toByteArray();/*ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(out.toByteArray());byte[] bytes = new byte[out.size()];byteArrayInputStream.read(bytes);BASE64Encoder encoder = new BASE64Encoder();String base64 = encoder.encode(bytes);*/return byteArray;}

2.合并海报

public static void merge(String backGroundImageUrl, /*String qrCodeUrl*/byte[] buf, HttpServletResponse response) {String title="全平台累计中奖100000人";int size = 35;// 添加字体的属性设置Font font = new Font("黑体", Font.BOLD, size);try {//加载背景图片(也就是模板图)BufferedImage backGroundImage = ImageIO.read(Objects.requireNonNull(getInputStreamByGet(backGroundImageUrl)));//加载二维码图片(也就是需要合成到模板图上的图片)//BufferedImage imageCode = ImageIO.read(new File(qrCodeUrl));BufferedImage imageCode = ImageIO.read(new ByteArrayInputStream(buf));//把背景图片当做为模板Graphics2D graphics = backGroundImage.createGraphics();//在模板上绘制图象(需要绘图的图片,左边距,上边距,图片宽度,图片高度,图像观察者)同一个模板一般是不会变的//graphics.drawImage(imageCode, 30, 30, 20, 20, null);int width = Math.min(imageCode.getWidth(null), backGroundImage.getWidth() * 5 / 10);int height = imageCode.getHeight(null) > backGroundImage.getHeight() * 5 / 10 ? (backGroundImage.getHeight() * 5 / 10) : imageCode.getWidth(null);graphics.drawImage(imageCode, (backGroundImage.getWidth() - width) / 2, backGroundImage.getHeight() / 2 + 100, width, height, null);//设置字体graphics.setFont(font);//设置颜色graphics.setColor(Color.BLACK);//获取字体度量(字体度量是指对于指定字号的某种字体,在度量方面的各种属性)FontMetrics fontMetrics = graphics.getFontMetrics(font);//获取字体度量的宽度int textWidth = fontMetrics.stringWidth(title);//左边距=(模板图宽度-文字宽度)/2int widthX = (backGroundImage.getWidth() - textWidth) / 2-150;//g.drawString(title, 820, 2850);//绘制文字(内容,左边距,上边距),同一个模板上边距一般也是不变的graphics.drawString(title, widthX, backGroundImage.getHeight() - (size * 2 + 20));graphics.drawString(title, widthX, backGroundImage.getHeight() - (size + 20));//完成模板修改graphics.dispose();//获取新文件的地址//imageName="E://aa.png;//File outPutFile = new File(imageName);ServletOutputStream outPutFile = response.getOutputStream();//生成新的合成过的用户二维码并写入新图片,指定类型为pngImageIO.write(backGroundImage, "png", outPutFile);// 刷新输出流outPutFile.flush();outPutFile.close();} catch (Exception e) {e.printStackTrace();}// 返回给页面的图片地址(因为绝对路径无法访问)//return imageName;}public static InputStream getInputStreamByGet(String url) {try {HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();conn.setReadTimeout(50000);conn.setConnectTimeout(50000);conn.setRequestMethod("GET");if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {return conn.getInputStream();}} catch (IOException e) {e.printStackTrace();}return null;}
	public static void main(String[] args) throws IOException, WriterException {byte[] bytes = generateQRCodeImages("4d5sa4ds4adsad4sd64d6s4a", 350, 350);ImageUtil.merge("http://oss.yunlegeyou.cn/wisdomlife/face/images/1715243426866.jpg",bytes,response);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序新技能解锁:轻松实现二维码扫描与识别

微信小程序新技能解锁&#xff1a;轻松实现二维码扫描与识别 在移动互联网时代&#xff0c;二维码已成为连接线上线下的桥梁&#xff0c;而微信小程序作为轻量级应用的代表&#xff0c;自然也少不了二维码扫描与识别的功能。本文将手把手教你如何在微信小程序中集成这项实用功…

【3dmax笔记】020:变换输入、世界坐标、屏幕坐标案例详解

文章目录 一、变换输入二、世界坐标三、屏幕坐标四、区别一、变换输入 变换输入可用于:移动/旋转/缩放变换输入,快捷键为F12,在变换输入窗口中,有两种常见重要的坐标系: 世界坐标:固定屏幕坐标:随着选择的视图发生变化在3ds Max中,世界坐标(World Coordinate System)…

Git Bash和Git GUI设置中文的方法

0 前言 Git是一个分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。一般默认语言为英文&#xff0c;本文介绍修改Git Bash和Git GUI语言为中文的方法。 1 Git Bash设置中文方法 &#xff08;1&#xff09;鼠标右键&#xff0c;单击“Git B…

网络无线网卡无法配置正确的 dns 服务器

网络无线网卡无法配置正确的 dns 服务器--解决办法 网络无线网卡无法配置正确的 dns 服务器--解决办法 网络无线网卡无法配置正确的 dns 服务器–解决办法 建议先使用疑难反馈&#xff08;自带的&#xff09; 打开网络适配中心 之后更改适配器设置&#xff0c;在点击 wlan 属…

【linux】linux工具使用

这一章完全可以和前两篇文件归类在一起&#xff0c;可以选择放一起看哦 http://t.csdnimg.cn/aNaAg http://t.csdnimg.cn/gkJx7 拖更好久了&#xff0c;抱歉&#xff0c;让我偷了会懒 1. 自动化构建工具 make , makefile make 是一个命令&#xff0c;makefile 是一个文件&…

jdk安装使用(Linux)

文章目录 JDK在Linux的安装Linux运行打包好的springboot项目停止在Linux服务器上运行的Spring Boot应用程序 JDK在Linux的安装 在Linux上安装JDK&#xff08;Java Development Kit&#xff09;可以通过以下步骤完成&#xff1a; 下载JDK安装包&#xff1a; 访问Oracle官方网站…

【Java】变量类型

类变量&#xff1a;独立于方法之外的变量&#xff0c;用static修饰实例变量&#xff1a;独立于方法之外的变量&#xff0c;不过没有static修饰局部变量&#xff1a;类的方法中的变量 示例1&#xff1a; public class test_A {static int a;//类变量(静态变量)String b;//实例…

Mysql 日志(redolog, binlog, undoLog)

重做日志-redolog 是什么 innoDB存储引擎层面的日志&#xff0c;它的作用是当 数据更新过程中数据库发生异常导致提交的记录丢失 为什么 mysql的基本存储结构是页&#xff08;记录都在页里面&#xff09;&#xff0c;所以更新语句时&#xff0c;mysql需要先把要更新的语句找…

Softing工业推出的edgeConnector将Allen-Bradley控制器集成到工业边缘应用中

2024年4月17日&#xff08;哈尔&#xff09;&#xff0c;Softing宣布扩展其基于Docker的edgeConnector产品系列&#xff0c;推出了新软件模块edgeConnector Allen Bradley PLC&#xff0c;可方便用户访问来自ControlLogix和CompactLogix控制器数据。 &#xff08;edgeConnector…

Linux提权--定时任务--打包配合 SUID(本地)文件权限配置不当(WEB+本地)

免责声明:本文仅做技术交流与学习... 目录 定时任务 打包配合 SUID-本地 原理: 背景: 操作演示: 分析: 实战发现: 定时任务 文件权限配置不当-WEB&本地 操作演示: 定时任务 打包配合 SUID-本地 原理: 提权通过获取计划任务执行文件信息进行提权 . 1、相对路径和…

Rust中忽略JSON反序列化时的不必要字段

在Rust中处理JSON数据时&#xff0c;经常会遇到JSON数据中包含一些在目标数据结构中不存在的字段的情况。如果你使用的是serde和serde_json这两个流行的库来处理JSON&#xff0c;那么有一些简单的方法可以忽略这些不必要的字段。 默认行为&#xff1a;忽略未知字段 在Rust中&…

人工智能专业(科普)

Ⅰ 简介 人工智能&#xff08;Artificial Intelligence&#xff09;是中国普通高等学校本科专业。人工智能&#xff0c;是一个以计算机科学为基础&#xff0c;由计算机、心理学、哲学等多学科交叉融合的交叉学科、新兴学科&#xff0c;研究、开发用于模拟、延伸和扩展人的智能…

在vue3中,如何优雅的使用echarts之实现大屏项目

前置知识 效果图 使用技术 Vue3 Echarts Gasp Gasp&#xff1a;是一个 JavaScript动画库,它支持快速开发高性能的 Web 动画。在本项目中&#xff0c;主要是用于做轨迹运动 所需安装的插件 npm i echarts npm i countup.js 数字滚动特效 npm i gsap javascript动画库 np…

MogDBopenGauss查询重写规则lazyagg

在MogDB&openGauss中&#xff0c;参数rewrite_rule用于控制查询重写&#xff0c;本文介绍查询重写规则lazyagg 在未设置rewrite_rulelazyagg的情况下&#xff0c;子查询中有GROUP BY会先进行GROUP BY lazyagg表示延迟聚合运算&#xff0c;目的是消除子查询中的聚合运算&…

宝塔面板怎么解决nginx跨域问题

1.找到宝塔的nginx配置文件 宝塔有一点不同&#xff0c;nginx配置文件不在nginx的安装目录中&#xff0c;应当去/www/server/panel/vhost/nginx找到 2.添加你要跨域的地址 location /api {proxy_pass http://localhost:8080;proxy_set_header Host $host;proxy_set_header X-…

维护祖传项目Tomcat部署war包

文章目录 1. 安装tomcat2. 解决Tomcat启动日志乱码3. idea配置启动war包 1. 安装tomcat 选择免安装版本&#xff0c;只需要在系统变量里面配置一下。 新增系统变量 CATALINA_HOME D:\Users\common\tomcat\apache-tomcat-8.5.97-windows-x64\apache-tomcat-8.5.97 编辑追加Path…

FPGA SDRAM读写控制器

感谢邓堪文大佬 &#xff01; SDRAM 同步动态随机存取内存&#xff08;synchronousdynamic randon-access menory&#xff0c;简称SDRAM&#xff09;是有一个同步接口的动态随机存取内存&#xff08;DRAM&#xff09;。通常DRAM是有一个异步接口的&#xff0c;这样它可以随时响…

Node.js基础:从入门到实战

初识 Node.js 与内置模块 &#xff08;初识&#xff09; 1、知道什么是node.js 2、知道node.js可以做什么 3、node.js 中js的组成部分 &#xff08;内置模块&#xff09; 4、用 fs 模块读写操作文件 5、使用 path 模块处理路径 6、使用http 模块写一个基本的web服务器 初识 N…

第1章 信息系统综合知识 1.4 IT战略

第1章 信息系统综合知识 1.4 IT战略 1.4.1 IT战略的内涵 IT战略&#xff0c;是在诊断和评估企业信息化现状的基础上&#xff0c;制定和调整企业信息化的指导纲领&#xff0c;争取企业以最合适的成本&#xff0c;去做最合适的信息化工作。 IT战略制定步骤: 定方向:明确远景…

设计模式——模板设计模式(Template Method)

模板设计-base 什么是模板&#xff1f; 举个简单的例子&#xff0c;以AABB的格式&#xff0c;写出一个词语&#xff0c;你可能会想到&#xff0c;明明白白&#xff0c;干干净净等&#xff0c; 这个AABB就是一个模板&#xff0c;对模板心中有了一个清晰的概念之后&#xff0c;…