二维码是什么?java生成二维码

article/2025/9/23 21:41:03

生成二维码的网站可用于测试:草料二维码

参考资料:二维码(QR code)基本结构及生成原理

二维码 (2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。

在许多种类的二维条码中,常用的码制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等。

二维条码/二维码可以分为堆叠式/行排式二维条码和矩阵式二维条码。其中矩阵式二维码因QR CODE而广泛流行,我们现在所说的二维码一般即指QR CODE。

QR(Quick-Response) code是被广泛使用的一种二维码,解码速度快。具有以下特点:1.存储大容量信息;2.在小空间内打印;3.有效表现各种字母(1994年由日本DW公司发明);4.对变脏和破损的适应能力强;5.可以从任意方向读取(三处定位图案);6.支持数据合并功能。

QR code包括:QR码(模型1模型2),Micro QR码,iQR码。

QR code的基本结构如下:


二维码基本结构
位置探测图形、位置探测图形分隔符、定位图形:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异;

校正图形:规格确定,校正图形的数量和位置也就确定了;

格式信息:表示改二维码的纠错级别,分为L、M、Q、H;

版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。

数据和纠错码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)。

QR码的编码过程:1.数据分析;2.数据编码;;3.纠错编码;4.构造最终数据信息;5.构造矩阵;6.掩摸;7.格式和版本信息。

QR码的解码过程:有兴趣可查阅:如何笔算解码二维码?

以上文本摘抄自参考资料,具体概念请查阅原文。
 


java生成二维码demo:

本demo基于springboot。
1、添加依赖:

<!-- 二维码相关 --><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.3.0</version></dependency><!-- 长链接转短链接 相关 --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency>

2、编写工具类:
ShortNetAddressUtil.java:

import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;/*** * 长链接转短链接的工具类<br>* @author zhu**/
public class ShortNetAddressUtil {public static CloseableHttpClient httpclient;static {httpclient = HttpClients.createDefault();}/*** 生成短连接信息*/public static String generateShortUrl(String url) {try {HttpPost httpost = new HttpPost("http://suo.im/api.php");List<NameValuePair> params = new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("format", "utf-8")); // 编码params.add(new BasicNameValuePair("url", url)); // 用户名称httpost.setEntity(new UrlEncodedFormEntity(params, "utf-8"));HttpResponse response = httpclient.execute(httpost);String jsonStr = EntityUtils.toString(response.getEntity(), "utf-8");return jsonStr;} catch (Exception e) {e.printStackTrace();return "Error";}}/*** 测试生成短连接*/public static void main(String[] args) {String url = generateShortUrl("https://www.baidu.com/s?wd=%E7%A0%81%E4%BA%91&rsv_spt=1&rsv_iqid=0x964c1c3500030761&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=48021271_11_hao_pg&rsv_enter=1&oq=spring%2520data%2520jpa%25E8%2587%25AA%25E5%25AE%259A%25E4%25B9%2589%25E6%2596%25B9%25E6%25B3%2595%25E8%25A7%2584%25E8%258C%2583&rsv_t=d5f86AreI8IAKjbxCKuUMFkUO6EKFeso61joDwkdQQrpLo%2BgDuuyujzyCafz%2B5gC8IMw8TR3iRoe&rsv_pq=f35da7870001b1ba&inputT=7063&rsv_sug3=74&rsv_sug1=50&rsv_sug7=100&bs=spring%20data%20jpa%E8%87%AA%E5%AE%9A%E4%B9%89%E6%96%B9%E6%B3%95%E8%A7%84%E8%8C%83");System.out.println(url);}}

测试结果:

 

注意:
这个工具类用来将长链接转换成短链接。在实际项目中,二维码往往都与微信或支付宝挂钩,而与它们挂钩的话链接必然很长,太长的链接会降低二维码的识别速度以及识别率,所以要将它们转换成短链接。常用的缩短网址接口有百度的,新浪的,但是我按照网上的测试百度和新浪的都失败了,所以用了suo.im这个网的接口。这个接口经测试可用,但是偶尔扫码时偶尔会扫出广告。如果知道怎么用百度接口或者新浪接口的老铁还请赐教哦!

QRCodeUtil.java:

import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
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;/*** 生成二维码图片流* * @author zhu**/
public class QRCodeUtil {public static BitMatrix generateQRCodeStream(String content,HttpServletResponse response) {//给相应添加头部信息,主要告诉浏览器返回的是图片流response.setHeader("Cache-Control", "no-store");// 不设置缓存response.setHeader("Pragma", "no-cache");response.setDateHeader("Expires", 0);response.setContentType("image/png");//设置图片的文字编码以及内边框Map<EncodeHintType, Object> hints = new HashMap<>();//编码hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");//边框距hints.put(EncodeHintType.MARGIN, 0);BitMatrix bitMatrix;try {//参数分别为:编码内容、编码类型、图片宽度、图片高度,设置参数bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, 300, 300,hints);}catch(WriterException e) {e.printStackTrace();return null;}return bitMatrix;}}

这个工具类的BitMatrix方法就是将传入的content生成二维码。

3、编写Controller:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.zhu.QRCodeTest.util.QRCodeUtil;
import com.zhu.QRCodeTest.util.ShortNetAddressUtil;/*** 测试生成二维码* * @author zhu**/
@Controller
@RequestMapping("/qrcode")
public class QRCodeTestController {@RequestMapping(value = "/generateqrcode", method = RequestMethod.GET)@ResponseBodypublic void generateQRCode4Product(HttpServletRequest request, HttpServletResponse response) {String longUrl;try {longUrl = "https://www.jianshu.com/u/c0aa31157ba5";// 转换成短urlString shortUrl = ShortNetAddressUtil.generateShortUrl(longUrl);// 生成二维码BitMatrix qRcodeImg = QRCodeUtil.generateQRCodeStream(shortUrl, response);// 将二维码输出到页面中MatrixToImageWriter.writeToStream(qRcodeImg, "png", response.getOutputStream());} catch (Exception e) {e.printStackTrace();}}}

注意:
这个controller首先是先定义了一个longUrl,然后调用工具类转换成短shortUrl,再调用生成二维码的工具类,传入shortUrl,生成二维码,最后用response输出到页面中。
这里并没有用到HttpServletRequest,删掉也可以。在实际项目开发中,longUrl肯定不是写死的,肯定是根据前端传入的各种参数拼接而成,HttpServletRequest就是用来获取前端参数的。

测试:
在浏览器直接输入localhost:8080/qrcode/generateqrcoe,就可看到二维码

 手机任意工具扫描二维码就可以进入到刚才controller中写的longUrl。

在页面中显示二维码只需要用img标签,src指向该controller路由即可。如下:

4、前端页面:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<img alt="二维码"  src="/qrcode/generateqrcode">
</body>
</html>

访问前端页面:

 

经测试,二维码也是有效的。

总结:

生成二维码其实也挺简单的,说白了就是两个工具类以及一个将二维码输出到客户端的controller。



作者:贪挽懒月
链接:https://www.jianshu.com/p/5f73f2afb1ff
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

推荐一个免barcode api,这个控件有免费版的,生成二维码的代码比较简单

 


http://chatgpt.dhexx.cn/article/7FcToom3.shtml

相关文章

关于Java生成二维码(zxing)

使用zxing生成二维码 提示&#xff1a;需要自己添加执行zxing.jar包 操作:点击链接去下载zxing包。GitHub - zxing/zxing: ZXing ("Zebra Crossing") barcode scanning library for Java, Androidhttps://github.com/zxing/zxing/ 文章目录 前言一、zxing是什么&…

一步一步教你用 java 生成二维码

一步一步用java设计生成二维码 在物联网的时代&#xff0c;二维码是个很重要的东西了&#xff0c;现在无论什么东西都要搞个二维码标志&#xff0c;唯恐落伍&#xff0c;就差人没有用二维码识别了。也许有一天生分证或者户口本都会用二维码识别了。今天心血来潮&#xff0c;看见…

java生成二维码到文件,java生成二维码转成BASE64

java生成二维码到文件&#xff0c;java生成二维码转成BASE64 如题&#xff0c;利用java和第三方库&#xff0c;把指定的字符串生成二维码&#xff0c;并且把二维码保存成图片&#xff0c;转换成BASE64格式。 需要的jar文件&#xff1a; package com.xueyoucto.xueyou;import …

关于java生成二维码:QR Code

QR Code的生成和读取在两个文件&#xff1a; 生成&#xff1a;QRcode​​​​​qrcode encoder (cgi programs/libralies) , QRcode demo and document of how to createhttp://www.swetake.com/qrcode/index-e.html 读取&#xff1a; オープンソースのQRコードデコードライ…

JAVA-生成二维码图片

JAVA-生成二维码图片 有很多大佬写了&#xff0c;但是这种花里胡哨的活我最喜欢搞了 首先是依赖 官网地址&#xff1a;https://mvnrepository.com/artifact/com.google.zxing/core 一般找用的最多的&#xff0c;相对稳定&#xff0c;出问题了也肯定有大佬给出相对应的解决办…

原来Java生成二维码这么简单

文章目录 一、二维条码/二维码(2-dimensional bar code)的概念二、二维码的发展历史三、二维码的分类四、二维码的优缺点五、QR Code六、实例开发1、zxing生成二维码2、zxing进行二维码解析3、使用QR Code方式生成和解析二维码4、jquery-qrcode生成二维码 一、二维条码/二维码(…

java生成二维码,跳转到指定页面

一、介绍&#xff1a;生成二维码有很多种方法&#xff0c;比如微信公众号的生成二维码&#xff0c;但是这个二维码只能用微信扫描且会&#xff08;可以带参数&#xff09;自动跳转到微信的公众号页面&#xff0c;不支持跳转到其他网页。这里说的二维码是扫描&#xff08;微信、…

Java生成二维码(附工具类)

后台Java生成二维码 这里用到了谷歌的zxing包&#xff0c;maven依赖如下&#xff1a; <!-- 二维码依赖开始--><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.0</version></…

java生成二维码最简单方法

昨天接到了一个需求是通过jave服务端动态生成二维码&#xff0c;提供给前端调用&#xff0c;这里就介绍一下生成的过程。 我这里是一个springboot服务&#xff0c;springboot服务的jar包就不贴了 这里只粘贴二维码用到的依赖。 1、pom依赖&#xff0c;这里只用到了两个依赖 &…

java生成二维码(链接生成二维码)

Java二维码如何生成&#xff1f; awt。image。BufferedImage; import java。io。File; import javax。imageio。ImageIO; import com。swetake。util。Qrcode; public class QRCodeEncoderTest { public static void main(String[] args) throws Exception { Qrcode qrco…

JAVA生成二维码QRcode

JAVA生成二维码QRcode 1 : 配置集成1.1、配置maven1.2、配置文件1.3、logo文件 2 : 代码集成2.1、加载配置文件2.2、工具类2.3、测试类 3 : 测试结果3.1、生成二维码3.2、扫描结果3.3、资源 1 : 配置集成 1.1、配置maven pom文件中添加一下配置 <!-- QR code --> <…

Java实现生成二维码

前言&#xff1a; 目前所分享的技术栈为Javaweb之后学运用到的 有喜欢我分享的一些demo可以多多交流 生成二维码前提&#xff1a; 1.需要引入谷歌所推荐使用的jar包 2.此jar包名称叫做zxing&#xff0c;目前我还没找到能所下载的jar包 3.我这里有自己制作好的jar包可以云盘下…

使用Java生成二维码图片(亲测)

下面我来分享两种生成二维码图片的方法。 第一种&#xff0c;填入你扫描二维码要跳转的网址直接生成二维码 第一步&#xff1a;导入相关的包 1 <dependency> 2 <groupId>com.google.zxing</groupId> 3 <artifactId>core</artifactId>…

Java生成二维码的几种实现方式(基于Spring Boot)

本文将基于Spring Boot介绍两种生成二维码的实现方式&#xff0c;一种是基于Google开发工具包&#xff0c;另一种是基于Hutool来实现&#xff1b; 为了方便理解二维码的实际应用场景&#xff0c;举一些例子&#xff01; &#xff08;1&#xff09;进销存系统 想必大家都听说过…

RK3562 camera调试:MIPI资源和配置

这篇文章给大家介绍一下RK新的一颗RK3562的camera资源以及MIPI的配置。 目录 &#xff08;1&#xff09;RK3562 camera资源 ①RK3562 camera硬件框图 ②MIPI-CSI资源 ③VICAP资源 ④ISP资源 ⑤最多支持camera数量 &#xff08;2&#xff09;dts配置 &#xff08;3&…

电子设计入门——单片机最小系统

写在前面 本文以STM32F401RCT6为例&#xff0c;讲解单片机最小系统的设计方法&#xff0c;以及一些相关的原理。 上图所示即为单片机最小系统电路&#xff0c;我们将其分为三个部分&#xff0c;即电源电路、复位电路、时钟电路。在了解最小电路之前&#xff0c;我们先看看下面…

LCD/HDMI OUT调试经验(4)------点亮LCD

本文以最近在QCM6490平台调试的一块FT8719为例&#xff0c;详细介绍点亮一块LCD屏幕的完整过程。 点亮屏幕的操作主要分两部分&#xff1a;上电和配置MIPI参数。上电保证屏幕可以有正常的背光&#xff0c;而MIPI参数保证有合适的清晰度&#xff0c;分辨率和画面。 一、上电 拿…

AVD那些事儿

启动了AVD却说找不到AVD 错误提示&#xff1a; No active compatible AVDs or devices found. Relaunch this configuration after connecting a device o 查看你的project版本是运行在哪个版本的&#xff08;AndroidManifest.xml中android:targetSdkVersion属性&#xff09…

AVD的安装和配置

一、创建配置AVD 运行Eclipse &#xff0c;选择“window->Android Virtual Device Manager”&#xff1b;或者运行C盘根目录下的android-sdk-windows文件夹中的文件AVD Manager.exe&#xff0c;弹出一个对话框&#xff0c; 点击“New...”按钮&#xff0c;在弹出的对话框中…

【原理图】电路中的VCC VDD VSS VEE GND含义 以及STM32电源

原理图中经常出现的VCC VDD VSS VEE GND是什么意思呢&#xff1f; 总的来说 VDD&#xff0c;是Virtual Device Driver的缩写 VCC&#xff0c;是Volt Current Condenser的简写 GND 接地 他们的命名来自于MOS管和晶体管的接法&#xff0c;这个以后再提。 VCC vcc一般表示通用芯…