当前位置: 首页 > news >正文

基于zxing生成二维码

概要:

  1. 二维码的原理
  2. 基于zxing生成二维码
  3. 逻辑及其应用
    完整代码:https://github.com/122537067/zxingQRcodeLogoColor

效果图:image

1.二维码的原理
我们要生成二维码并且设置其样式(中间图片大小、二维码大小、颜色等)需要对其原理有所理解,使生成二维码纠错率高同时还符合美观。
简单的说:二维码就是一串信息,通过设备扫二维码获取信息。

2.基于zxing生成二维码
本项目以spring boot为例子

pom.xml引入包
<!--生成二维码--> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.0</version> </dependency>

QRCodeUtil.java (其中一个工具类的java文件)
`package com.hwx.gzdm.oneUtils;

/**

  • @program:gzdm
  • @author:wihenne
  • @creatTime:2021/10/28
    **/

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**

  • 二维码工具类
  • @author Wihenne

*/

public class QRCodeUtil {

private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;/*** 生成二维码* @param content       扫码内容* @param QRcodeWidth   二维码宽度* @param QRcodeHeigh   二维码高度* @param logoWidth     logo宽度* @param logoHeigh     logo高度* @param logoPath      logo相对路径(null时不加logo)* @param QRcodeColor   二维码颜色* @return* @throws Exception*/
public static String generateQRcode(String content,int QRcodeWidth,int QRcodeHeigh,int logoWidth, int logoHeigh,String logoPath, int QRcodeColor) throws Exception{/** 定义Map集合封装二维码配置信息 */Map<EncodeHintType, Object> hints = new HashMap<>();/** 设置二维码图片的内容编码 */hints.put(EncodeHintType.CHARACTER_SET, "utf-8");/** 设置二维码图片的上、下、左、右间隙 */hints.put(EncodeHintType.MARGIN, 1);/** 设置二维码的纠错级别 */hints.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.H);/*** 创建二维码字节转换对象* 第一个参数:二维码图片中的内容* 第二个参数:二维码格式器* 第三个参数:生成二维码图片的宽度* 第四个参数:生成二维码图片的高度* 第五个参数:生成二维码需要配置信息*  */BitMatrix matrix = newMultiFormatWriter().encode(content,BarcodeFormat.QR_CODE, QRcodeWidth, QRcodeHeigh, hints);/** 获取二维码图片真正的宽度  */int matrix_width = matrix.getWidth();/** 获取二维码图片真正的高度  */int matrix_height = matrix.getHeight();/** 定义一张空白的缓冲流图片 */BufferedImage image = newBufferedImage(matrix_width, matrix_height,BufferedImage.TYPE_INT_RGB);/** 把二维码字节转换对象 转化 到缓冲流图片上 */for (int x = 0; x < matrix_width; x++){for (int y = 0; y < matrix_height; y++){/** 通过x、y坐标获取一点的颜色 true: 黑色  false: 白色 */int rgb = matrix.get(x, y) ? QRcodeColor : 0xFFFFFF;image.setRGB(x, y, rgb);}}if(!logoPath.equals("null")) {/** 获取logo图片 *//*** static 内不能用this获取绝对路径* 通过getCanonicalPath获取当前程序的绝对路径*/File directory = new File("");//参数为空String courseFile = directory.getCanonicalPath();String path = courseFile + "/C:/hwx/" +logoPath;System.out.println(path);BufferedImage logo = ImageIO.read(new File(path));/** 获取缓冲流图片的画笔 */Graphics2D g = (Graphics2D) image.getGraphics();/** 在二维码图片中间绘制logo */g.drawImage(logo, (matrix_width - logoWidth) / 2,(matrix_height - logoHeigh) / 2,logoWidth, logoHeigh, null);/** 设置画笔的颜色 */g.setColor(Color.WHITE);/** 设置画笔的粗细 */g.setStroke(new BasicStroke(5.0f));/** 设置消除锯齿 */g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);/** 绘制圆角矩形 */g.drawRoundRect((matrix_width - logoWidth) / 2,(matrix_height - logoHeigh) / 2,logoWidth, logoHeigh, 10, 10);}/** 生成二维码 */TimeUtil timeUtil = new TimeUtil();String qrcodeName = timeUtil.dateToRandom(1)+".png";ImageIO.write(image, "png", new File("C:/hwx/QRcode/code/" + qrcodeName));//输出带logo图片return "/QRcode/code/" + qrcodeName;
}
public static void main(String[] args) throws Exception{generateQRcode("https://blog.csdn.net/one_hwx",300,300,90,120,"default/67.jpg",0x6495ED);
}}`

修改代码中logo以及生成二维码路径即可。

3.逻辑及其应用
目前生成的二维码是固定一个地址,不可编辑其地址内容。
举例:我要生成一个二维码印刷在书本上,扫一扫可以看到其答案。如果有一天我要修改答案的内容是不是就要更改二维码,那样之前的印刷就会作废,大大增加成本。
可以参考活码原理:
image
制作一个中间跳转页面,设置参数另其跳转。

http://www.jsqmd.com/news/487663/

相关文章:

  • 时序数据库选型指南:从架构演进看Apache IoTDB的工业级优势
  • map映射和哈希映射
  • 未来 5 年,对于程序员群体而言非AI 大模型莫属!
  • 鸿蒙中 卡片交互:message事件(三)
  • 工作总结-接口设计
  • 西门子smart 200 rtu方式通讯四台三菱E700变频器资料 硬件:smart plc...
  • ChatGPT 引言写作指南:从新手到高手的结构化方法
  • YOLO系列算法改进 | 主干改进篇 | 替换ParameterNet参数优先网络 | 利用动态卷积自适应调整卷积核,助力模型低光照下增强边缘响应 | CVPR 2024
  • 永磁同步电机矢量控制FOC仿真:id=0与MTPA两种控制策略的对比分析与参考文献
  • P2679 [NOIP 2015 提高组] 子串
  • 3-16午夜盘思
  • 深入探究:直流电机单双闭环调速系统仿真模型与参数优化设计报告
  • XSLT快速入门:XML转换全攻略
  • 【论文精读】CodeWMBench 揭示 AI 生成代码水印的残酷真相
  • AudioSeal Pixel Studio从零开始:Windows平台Anaconda环境完整配置流程
  • TB6612FNG直流电机驱动板原理图设计,已量产
  • 工业级隔离型RS485接口电路原理图设计,已量产
  • 孙珍妮AI形象生成镜像指南:Z-Image-Turbo LoRA模型安全加载与沙箱隔离配置
  • Cosmos-Reason1-7B企业应用:化工厂监控视频中识别泄漏源与扩散模拟建议
  • 探索COMSOL中的Merging off-gamma BIC计算
  • std::process::Command
  • 用M文件在Matlab 2019a中实现两电平三相SVPWM
  • 乐高兼容ESP32对讲机:模块化嵌入式音频通信设计
  • 旋转卡壳
  • 基于Simulink的固定频率滞环电流控制Boost变换器
  • 南北阁Nanbeige 4.1-3B行业方案:数据库课程设计智能辅导系统
  • HCIP第二次作业
  • YOLOv8训练Visidron小目标检测数据集及精度提升实践
  • Phi-4-reasoning-vision-15B应用场景:工业质检报告截图→缺陷类型/位置/等级三字段结构化
  • 南北阁 4.1-3B 部署案例:中小团队低成本构建私有化AI对话系统的落地路径