最近项目需要,重新了解了下二维码的自定义文字绘画,直接上代码,记录一下。

一:导入Maven依赖

<!-- Zxing -->
<dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.0</version>
</dependency>
<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.0</version>
</dependency>
<!-- Zxing -->

二:创建文字实体类

package com.bhy702.common.utils.code;import lombok.Data;
import java.awt.Color;
import java.awt.Font;@Data
public class QRCodeFont{private int startX;//文字显示x坐标private int startY;//文字显示y坐标private String text;//文字内容private Color color = Color.BLACK;//文字显示颜色,这里先默认黑色private Font font;//字体样式public QRCodeFont(){};public QRCodeFont(int startX, int startY, String text, Color color, Font font){this.startX = startX;this.startY = startY;this.text = text;this.color = color;this.font = font;}
}

四:ZXingCodeUtils工具类

提示: 多看注释!

package com.bhy702.common.utils.code;import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class ZXingCodeUtils {/*** CODE_WIDTH:二维码宽度,单位像素* CODE_HEIGHT:二维码高度,单位像素* FRONT_COLOR:二维码前景色,0x000000 表示黑色* BACKGROUND_COLOR:二维码背景色,0xFFFFFF 表示白色* IMAGE_WIDTH:总画布宽度,单位像素* IMAGE_HEIGHT:总画布高度,单位像素*/private static final int CODE_WIDTH = 400;private static final int CODE_HEIGHT = 400;private static final int FRONT_COLOR = 0x000000;private static final int BACKGROUND_COLOR = 0xFFFFFF;// 总的画布宽和高,必须比二维码以及文字的展示区域像素更宽更高,不然会画超出区域而不可见。// 也可以在画之前写个方法根据二维码宽高以及文字的宽高(文字长度/字体字号决定)及坐标记算。private static final int IMAGE_WIDTH = 650;private static final int IMAGE_HEIGHT = 450;/*** 创建二维码* @param content* @return BufferedImage* @throws WriterException*/public static BufferedImage createQRCode(String content) throws WriterException {BufferedImage bufferedImage = new BufferedImage(CODE_WIDTH, CODE_HEIGHT, BufferedImage.TYPE_INT_RGB);Map<EncodeHintType, Object> hints = new HashMap();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q);hints.put(EncodeHintType.MARGIN, 1);MultiFormatWriter multiFormatWriter = new MultiFormatWriter();BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, CODE_WIDTH, CODE_HEIGHT, hints);for (int x = 0; x < CODE_WIDTH; x++) {for (int y = 0; y < CODE_HEIGHT; y++) {bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? FRONT_COLOR : BACKGROUND_COLOR);}}return bufferedImage;}/**** 创建画布,绘画组合文字与二维码* @param content* @param qrCodeFontList* @return BufferedImage* @throws WriterException*/public static BufferedImage drawTextCodeInImage(String content,  List<QRCodeFont> qrCodeFontList) throws WriterException {//将image生成二维码图片对象BufferedImage bufferedImage = createQRCode(content);//计算总画布的宽高//根据总宽高,创建文字图片对象BufferedImage image = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);Graphics graphics = image.createGraphics();//画二维码,这里从左上角(0,0)开始画二维码,宽高与二维码一致。graphics.drawImage(bufferedImage, 0, 0, CODE_WIDTH, CODE_HEIGHT, null);bufferedImage.flush();//填充二维码以外的透明背景区域为白色,默认为黑色//注意:如果二维码想要黑边,循环体if判断改为(x > CODE_WIDTH || y > CODE_HEIGHT)即可有1像素宽度的黑边for (int x = 0; x < IMAGE_WIDTH; x++) {for (int y = 0; y < IMAGE_HEIGHT; y++) {if(x >= CODE_WIDTH || y >= CODE_HEIGHT){image.setRGB(x, y,BACKGROUND_COLOR);}}}//画文字qrCodeFontList.forEach((codeFont)->{Font font = codeFont.getFont();//获取字体的宽和高FontMetrics metrics = graphics.getFontMetrics(font);
//            int centerFontWidth = metrics.stringWidth(centerFont);
//            int  fontHeight = metrics.getHeight();//基线高度int ascentHeight = metrics.getAscent();//设置画笔的颜色graphics.setColor(codeFont.getColor());//设置字体及字号graphics.setFont(font);//写字时,y坐标为基线y坐标,不是绘画的起始y坐标,所以需要加上基线坐标ascentHeight,这样起始坐标就为我们设置的startY坐标了graphics.drawString(codeFont.getText(), codeFont.getStartX(), codeFont.getStartY()+ascentHeight);});//销毁图形界面资源graphics.dispose();return image;}}

五:测试

     @RequestMapping("/getCode")public static void getCode(HttpServletResponse resp) throws WriterException, IOException {String content = "www.baidu.com";//存放文字Font集合List<QRCodeFont> qrCodeFontList = new ArrayList<>();//字体样式Font font = new Font("宋体", 5, 30);qrCodeFontList.add(new QRCodeFont(400,0,"test:x-400,y-0",Color.BLACK,font));qrCodeFontList.add(new QRCodeFont(410,100,"test:x-410,y-100",Color.BLACK,font));qrCodeFontList.add(new QRCodeFont(10,410,"test:x-10,y-410",Color.BLACK,font));//生成含文字的二维码BufferedImage bufferedImage = ZXingCodeUtils.drawTextCodeInImage(content, qrCodeFontList);// 禁止图像缓存。resp.setHeader("Pragma", "no-cache");resp.setHeader("Cache-Control", "no-cache");resp.setDateHeader("Expires", 0);resp.setContentType("image/jpeg");// 将图像输出到Servlet输出流中。ServletOutputStream sos = resp.getOutputStream();ImageIO.write(bufferedImage, "jpeg", sos);sos.close();}

效果:


ZXing生成条形码,可参考我另一篇博客:java生成条形码,使用zxing框架,并去除条码两边空白


欢迎访问本文的个人博客链接: https://br-bai.github.io/2020/08/29/ZXing二维码自定义绘画文字

ZXing二维码自定义绘画文字相关推荐

  1. 自定义ZXing二维码扫描界面并解决取景框拉伸等问题

    自定义ZXing二维码扫描界面并解决取景框拉伸等问题 参考文章: (1)自定义ZXing二维码扫描界面并解决取景框拉伸等问题 (2)https://www.cnblogs.com/tommylemon ...

  2. zxing 二维码生成深度定制

    二维码生成服务之深度定制 之前写了一篇二维码服务定制的博文,现在则在之前的基础上,再进一步,花样的实现深度定制的需求,我们的目标是二维码上的一切都是可以由用户来随意指定 设计 1. 技术相关 zxin ...

  3. Java生成二维码底部带文字并且返回前端使用img接收

    目录 1.java生成二维码工具类 2.web测试 3.前端处理 4.测试结果 背景 本demo主要针对jdk1.6版本的,但是高版本的同样可以用,如果觉得不舒服可以自行添加高版本的依赖包. 准备工具 ...

  4. 谷歌zxing 二维码生成工具

    一.加入maven依赖 <!-- 谷歌zxing 二维码 --> <dependency><groupId>com.google.zxing</groupId ...

  5. com.google.zxing 二维码工具类

    com.google.zxing 二维码工具类 pom 工具类 使用 pom <dependency><groupId>com.google.zxing</groupId ...

  6. Marco's Java【小工具篇 之 Google Zxing 二维码生成】

    前言 二维码相信大家一定不陌生啦,去菜市场买菜,路边摊买个小吃都可以扫一扫,近几年来中国的二维码技术的普及也是大家有目共睹的,而二维码在其他国家虽然有用到,但极少,更没有说全国普及. 二维码又称二维条 ...

  7. uni-app微信小程序生成自定义参数二维码,跳转小程序指定页面,获取参数;uni-app微信小程序获取二维码自定义参数;微信小程序生成动态参数二维码;uni-app微信小程序获取动态参数二维码;

    一.场景需求: 在小程序个人名片页面A页面,生成用户的个人名片二维码(该二维码携带用户的唯一标识id):微信扫一扫或长按图片识别这个二维码,可以跳转到小程序的B页面,并且在B页面拿到二维码上的唯一标识 ...

  8. zxing二维码扫描预览变形的解决方案

    -----------------------------------2018.6.1更新--------------------------------------- 附上github地址: htt ...

  9. PHP生成二维码并添加文字(phpqrcode类)

    先看效果图 以下是phpqrcode类文件(里面包含字体文件,可直接用) 链接: https://pan.baidu.com/s/1u_3AAFtFxWuRdsCxJtjpyQ 提取码:cy2e 生成 ...

最新文章

  1. 分布式session一致性问题
  2. Bytom BIP-32协议和BIP-44协议解读
  3. HyperLedger Fabric 错误记录
  4. 用java做一个模拟彩票程序_JAVA模拟----- 彩票机子-----抽奖过程的实例化
  5. abb限位开关已打开drv1_Telemecanique传感器限位开关产品系列
  6. oracle全文检索 分区表,oracle全文检索
  7. 从 JVM 角度看 Spring 中方法执行过程和内存状态
  8. XILINX ZYNQ7100 的上电顺序
  9. L2-022. 重排链表(双队列)
  10. win10下使用opencv4.5.0 cuda版本编译和目标检测的几个问题
  11. web开发实例教程,CSS盒子模型居中方法
  12. 【图像压缩】基于matlab余弦变换及霍夫曼编码jpeg压缩和解压【含Matlab源码 2086期】
  13. 设置计算机系统语言,windows系统默认语言如何设置-windows系统默认语言设置方法 - 河东软件园...
  14. 关闭vscode中的源代码管理
  15. 第844期机器学习日报(2017-01-09)
  16. 【读点论文】EfficientFormer: Vision Transformers at MobileNet Speed,运用纯transformer架构对比卷积模型在终端上部署的推理速度
  17. 备忘 Linux 快速分区
  18. 操作系统:存储器管理(下)
  19. 机器学习之L1正则化和L2正则化(附源码解析)
  20. 游戏品类详解——SLG(策略类游戏)

热门文章

  1. 文本数据分析实战【数据清洗、统计分析、可视化展示、情感分析】
  2. 2022年全球市场柠檬酸单镁总体规模、主要生产商、主要地区、产品和应用细分研究报告
  3. javabean/Listjavabean与map/Listmap互相转换
  4. (电力开发)376.1 主站通信协议基本结构解析
  5. 在群晖上搭建基于 PostgreSQL 的 Joplin Server
  6. Imagenet数据集1000类别中英文
  7. P3975 [TJOI2015]弦论 (SAM)
  8. cad隐藏图层命令快捷键_Auto CAD如何隐藏全部图层,快捷键是什么?
  9. Web3:我们创造更好互联网的机会
  10. ucos 学习:STM32F107 学习板 资料收集