【Mac版】Java生成二维码

软件版本

IntelliJ IDEA:2023.2
JDK:17
Tomcat:10.1.11
Maven:3.9.3

技术栈

  • servlet
  • 谷歌的:zxing
    • 生成普通的黑白二维码
    • 在二维码中间添加一个小图标
  • github开源项目:qrcode
    • qrcode开源项目的内部是基于zxing实现的,可以让二维码更加酷炫

项目结构

在这里插入图片描述

环境搭建

创建Empty Project

image.png
在这里插入图片描述

在这里插入图片描述

设置SDK

在这里插入图片描述

在这里插入图片描述

设置Maven

在这里插入图片描述

在这里插入图片描述

注意:自己安装的maven中settings配置文件中已经配置了本地仓库的位置:
在这里插入图片描述

在这里插入图片描述

添加web支持

右键项目:
在这里插入图片描述

添加框架支持:

在这里插入图片描述

注意:如果File菜单中没有上图的“Add Framework Support…”怎么办?
image.png
image.png
这样File菜单中就有了。
继续添加框架支持:web4.0,不创建web.xml文件
image.png

pom.xml文件配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.powernode</groupId><artifactId>qrcode</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><dependencies><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version><scope>provided</scope></dependency></dependencies><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties></project>
  • 打包方式:war
  • 引入servlet依赖

确认web的根是否正确(重点)

在这里插入图片描述

设置tomcat并部署应用

在这里插入图片描述

image.png

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这个地方可能有些小伙伴还没有安装tomcat,mac推荐使用homebrew安装tomcat
在这里插入图片描述

然后这个Configure这里,需要我们自己去找:
在这里插入图片描述
在终端输入以获取tomcat路径:

brew ls tomcat

在这里插入图片描述
在这里插入图片描述
然后依次按照所给tomcat路径去找到自己的tomcat!

在这里插入图片描述

启动tomcat并访问

在这里插入图片描述

image.png

zxing相关依赖

<!--zxing依赖-->
<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.1.0</version>
</dependency>
<dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.1.0</version>
</dependency><!--commons-lang依赖-->
<dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version>
</dependency>

zxing常用API

EncodeHintType(编码提示类型)

EncodeHintType是用来设置二维码编码时的一些额外参数的枚举类型,常用枚举值如下:

  • ERROR_CORRECTION
    • 误差校正级别。对于黑白二维码,可选值为L(7%)、M(15%)、Q(25%)、H(30%),表示二维码允许破损的最大容错率。在二维码出现破损时,根据设置的容错率级别,可以尝试修复二维码中的一些数据。
    • 二维码在生成过程中,可能会出现一些损坏或者缺失的情况,例如打印时墨水耗尽、图像压缩、摄像头拍摄角度不对等。这些问题可能导致二维码无法完全识别,或者识别出来的数据不准确,而误差校正码就是为了解决这些问题而产生的。
    • 例如,选择L级别的容错率,相当于允许在二维码的整体颜色区域中,最多可有约7%的坏像素点;而选择H级别的容错率时,最多可有约30%的坏像素点。
    • 注意:误差校正级别的具体值需要通过ErrorCorrectionLevel的枚举值来获取。
  • CHARACTER_SET
    • 编码字符集。可以设置使用的字符编码,例如utf-8、gb2312等等。
  • MARGIN
    • 二维码的空白区域大小。可以设置二维码周围的留白大小,以便于在不同的嵌入场景中使用二维码。

MultiFormatWriter(多格式写入程序)

MultiFormatWriter是一个便捷的二维码生成类,可以根据传入的BarcodeFormat参数,生成对应类型的二维码。
MultiFormatWriter封装了一系列的二维码生成方法,可以生成多种格式的二维码,包括QR Code、Aztec Code、PDF417、Data Matrix等。

BarcodeFormat(码格式)

BarcodeFormat是枚举类,通过它来制定二维码格式:

  • QR Code :QR Code是最常见的二维码格式之一,广泛应用于商品包装、票务、扫码支付等领域。QR Code矩阵有黑白两种颜色,其中黑色部分表示信息的编码,白色部分则用于衬托和辨识。
  • Aztec Code:Aztec Code是一种高密度、可靠性很高的二维码格式。相比于其他二维码格式,它具有更低的容错率、更小的尺寸和更高的解码效率。因此,它适合用于储存一些核心信息,例如个人信息、证件信息、账户密码等。
  • PDF417:是一种可以储存大量信息的二维码格式,它具有数据密度高、可靠性强等优点,可以应用于许多场景,例如航空机票,运输和配送标签,法律文件等。
  • Data Matrix:是一种小巧的二维码格式,它的编码方式类似于QR Code,但是其可靠性、识别率、扫描速度和牢固度都比QR Code更优秀。由于尺寸较小、可靠性较高,因此Data Matrix适合嵌入简单的产品标签、医疗图像、检测数据等领域。

BitMatrix(位矩阵)

BitMatrix是ZXing库中表示二维码矩阵的数据结构,它是由0和1构成的二维数组,用于存储二维码的编码信息。在二维码生成过程中,我们通过对BitMatrix对象的构建和操作,最终生成一个可被扫描解码的二维码图像。

BitMatrix实际上是一个紧凑型的布尔型二维数组,往往只需要占用一个字节即可表示8位二进制。在使用BitMatrix时,我们可以通过其不同的方法,例如get()set()等,来获取、设置矩阵中每个位置的值。

在ZXing中,BitMatrix常用于将编码后的信息转化为矩阵形式,并进行图像的生成和输出。在使用ZXing生成二维码时,我们首先需要使用MultiFormatWriter.encode()方法来生成一个BitMatrix;然后,在对BitMatrix进行各种处理和操作后,就可以在UI中显示和输出二维码。

总的来说,BitMatrix是ZXing库中非常重要的数据结构之一,它负责存储和处理生成二维码图像所需的二进制信息,是实现二维码生成功能的关键。

BitMatrix常用API:

  • getHeight():获取矩阵高度
  • getWidth():获取矩阵宽度
  • get(x, y):根据x,y的坐标获取矩阵中该坐标的值。结果是true(黑色)或者false(白色)。

生成普通黑白二维码

前端代码:

<%--Created by IntelliJ IDEA.User: suyueDate: 2024/5/30Time: 16:21To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>使用JAVA语言生成二维码</title></head><body><h1>使用Google的zxing二维码生成工具生成普通的黑白二维码</h1><hr />请输入文本内容:<input type="text" id="url"/><button onclick="generateQRcode()">生成二维码</button><br/><hr /><img src="" id="qrcodeimg" /><script>function generateQRcode() {let url = document.getElementById("url").valuelet QRCode = document.getElementById("qrcodeimg");QRCode.src = "/QRcode/generate?url=" + url;}</script></body>
</html>

后端代码:

package com.powernode.qrcode.servlets;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;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;@WebServlet("/generate")
public class GenerateQRcode extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {try {// 准备一个Map集合,用来存储二维码图片的相关属性Map map = new HashMap();// 设置误差校验级别map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);// 设置字符编码(因为文本内容要转换成二维码,需要指定转换时采用的字符集)map.put(EncodeHintType.CHARACTER_SET, "utf-8");// 设置二维码的外边距map.put(EncodeHintType.MARGIN, 1);// 获取要生成二维码的文本内容String url = request.getParameter("url");// 创建MultiFormatWriter对象MultiFormatWriter writer = new MultiFormatWriter();// 传入:内容、码的格式、宽度、高度、二维码参数。返回位矩阵对象。BitMatrix bitMatrix = writer.encode(url, BarcodeFormat.QR_CODE, 300, 300, map);// 获取位矩阵的宽度和高度int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();// 创建BufferedImage对象BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 遍历位矩阵for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {// 0xFF000000 黑色// 0xFFFFFFFF 白色image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);}}// 响应ServletOutputStream out = response.getOutputStream();ImageIO.write(image, "png", out);out.flush();out.close();} catch(Exception e){e.printStackTrace();}}
}

运行效果:
在这里插入图片描述

生成一个带logo的黑白二维码

<%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<!doctype html>
<html>
<head><title>生成带有logo的黑白二维码</title><meta charset="UTF-8">
</head>
<body>
<form action="/myqrcode/generateWithLogo" method="post" enctype="multipart/form-data">请输入文本内容:<input type="text" name="url"><br>请选择图片:<input type="file" name="logo"><br><input type="submit" value="生成带有logo的二维码"/>
</form>
</body>
</html>
package com.powernode.qrcode.servlets;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;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.Part;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;@WebServlet("/generateWithLogo")
@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2, maxFileSize = 1024 * 1024 * 10, maxRequestSize = 1024 * 1024 * 100)
public class GenerateQrCodeWithLogo extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try {// 准备一个Map集合,用来存放二维码的属性Map map = new HashMap();map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);map.put(EncodeHintType.CHARACTER_SET, "UTF-8");map.put(EncodeHintType.MARGIN, 1);// 获取文本内容String url = request.getParameter("url");// 创建zxing核心对象MultiFormatWriter writer = new MultiFormatWriter();BitMatrix bitMatrix = writer.encode(url, BarcodeFormat.QR_CODE, 300, 300, map);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();// 生成二维码BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);}}// 给二维码添加logo// 第一部分:将logo缩放。// 获取上传的logo Part对象Part logo = request.getPart("logo");// 通过Part对象获取输入流InputStream inputStream = logo.getInputStream();// 通过ImageIO的read方法,从输入流中读取,从而获得logo图片Image logoImage = ImageIO.read(inputStream);// 获取logo图片的宽度int logoWidth = logoImage.getWidth(null);// 获取logo图片的高度int logoHeight = logoImage.getHeight(null);// 如果logo的宽度或者高度大于100,则重新赋值100if (logoWidth > 60) {logoWidth = 60;}if (logoHeight > 60) {logoHeight = 60;}// 使用平滑缩放算法对原logo图像进行缩放得到一个全新的图像。Image scaledLogo = logoImage.getScaledInstance(logoWidth, logoHeight, Image.SCALE_SMOOTH);// 第二部分:将缩放后的logo画到黑白二维码上// 获取2D画笔Graphics2D graphics2D = bufferedImage.createGraphics();// 开始画的x和y坐标int x = (300 - logoWidth) / 2;int y = (300 - logoHeight) / 2;// 将缩放后的logo画上去graphics2D.drawImage(scaledLogo, x, y, null);// 创建一个具有指定位置、宽度、高度和圆角半径的圆角矩形。这个圆角矩形是用来绘制边框的。Shape shape = new RoundRectangle2D.Float(x, y, logoWidth, logoHeight, 10, 10);// 使用一个宽度为4像素的基本笔触graphics2D.setStroke(new BasicStroke(4f));// 给logo画圆角矩形graphics2D.draw(shape);// 释放画笔graphics2D.dispose();// 响应ImageIO.write(bufferedImage, "png", response.getOutputStream());} catch (Exception e) {e.printStackTrace();}}}

运行效果:
在这里插入图片描述

使用github开源项目qrcode

<dependency><groupId>com.github.liuyueyi.media</groupId><artifactId>qrcode-plugin</artifactId><version>2.5.2</version>
</dependency>

生成黑白二维码

String url = request.getParameter("url");
BufferedImage image = QrCodeGenWrapper.of(url).asBufferedImage();
ImageIO.write(image, "png", response.getOutputStream());

生成带有logo的二维码

String url = request.getParameter("url");BufferedImage image = QrCodeGenWrapper.of(url).setLogo(request.getPart("logo").getInputStream()).setLogoRate(7) // 设置 logo 图片与二维码之间的比例。在这个例子中,它设置为 7,表示 logo 的宽度等于二维码的 1/7。.setLogoStyle(QrCodeOptions.LogoStyle.ROUND) // 设置 logo 图片的样式。设置为 ROUND,表示将 logo 的边框形状设置为圆形。.asBufferedImage();ImageIO.write(image, "png", response.getOutputStream());

生成彩色二维码

String url = request.getParameter("url");BufferedImage image = QrCodeGenWrapper.of(url).setDrawPreColor(Color.BLUE).asBufferedImage();ImageIO.write(image, "png", response.getOutputStream());

生成背景图二维码

String url = request.getParameter("url");BufferedImage image = QrCodeGenWrapper.of(url).setBgImg(request.getPart("logo").getInputStream()).setBgOpacity(0.7F).asBufferedImage();ImageIO.write(image, "png", response.getOutputStream());

特殊形状二维码

String url = request.getParameter("url");BufferedImage image = QrCodeGenWrapper.of(url).setDrawEnableScale(true) // 启用二维码绘制时的缩放功能.setDrawStyle(QrCodeOptions.DrawStyle.DIAMOND) // 指定绘制样式.asBufferedImage();ImageIO.write(image, "png", response.getOutputStream());

图片填充二维码

String url = request.getParameter("url");BufferedImage image = QrCodeGenWrapper.of(url).setErrorCorrection(ErrorCorrectionLevel.H) // 设置二维码的错误纠正级别.setDrawStyle(QrCodeOptions.DrawStyle.IMAGE) // 绘制样式采用图片填充.addImg(1, 1, request.getPart("logo").getInputStream()) // 添加图片.asBufferedImage();ImageIO.write(image, "png", response.getOutputStream());

生成gif动图二维码

String url = request.getParameter("url");BufferedImage image = QrCodeGenWrapper.of(url).setW(500).setH(500).setBgImg(request.getPart("logo").getInputStream()).setBgOpacity(0.6f).setPicType("gif").asBufferedImage();ImageIO.write(image, "gif", response.getOutputStream());

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

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

相关文章

一些关于深度聚类以及部分对比学习的论文阅读笔记

目录 资料SwAV问题方法方法的创新点为什么有效有什么可以借鉴的地方聚类Multi-crop 代码 PCL代码 Feature Alignment and Uniformity for Test Time Adaptation代码 SimSiam 资料 深度聚类算法研究综述(很赞&#xff0c;从聚类方法和深度学习方法两个方面进行了总结&#xff0…

STL中stack的使用

目录 一、stack类介绍和使用 stack类介绍 stack类定义 stack类常见构造函数 stack数据操作 empty()函数 top() pop() 和 push() 函数 size()函数 swap()函数 一、stack类介绍和使用 stack类介绍 1.stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下…

Python 关于字符串格式化

在Python中&#xff0c;字符串格式化有以下几种方法&#xff1a; 1.可以使用字符串的str.center(width), str.ljust(width), 和 str.rjust(width)方法来实现字符串的居中、左对齐和右对齐操作。 居中对齐&#xff1a; text "Python" centered_text text.center(10…

华为S5700交换机版本升级步骤

在用一台华为交换机。由于需要做目的镜像接口&#xff0c;在配置过程中超过一个双向流量观察口就会报错。从官方文档查到可以升级版本解决。记录一下升级过程。 首先确定设备型号S5700-28C-EI&#xff0c;版本&#xff1a; s5700ei-v100r005c01spc100。一定仔细阅读官方文档。明…

springboot基本使用十一(自定义全局异常处理器)

例如&#xff1a;我们都知道在java中被除数不能为0&#xff0c;为0就会报by zero错误 RestController public class TestController {GetMapping("/ex")public Integer ex(){int a 10 / 0;return a;}} 打印结果&#xff1a; 如何将这个异常进行处理&#xff1f; 创…

寺庙小程序-H5网页开发

大家好&#xff0c;我是程序员小孟。 现在有很多的产品或者工具都开始信息话了&#xff0c;寺庙或者佛教也需要小程序吗&#xff1f; 当然了&#xff01; 前面我们还开发了很多寺庙相关的小程序。 今天要介绍的是一款寺庙系统&#xff0c;该系统可以作为小程序、H5网页、安…

springboot实现文件上传功能,整合云服务

文章目录 这是springboot案例的,文件上传功能的拆分,本篇将带大家彻底了解文件上传功能,先从本地存储再到云存储,全网最详细版本,保证可以学会,可以了解文件上传功能的开发文件上传功能剖析进行书写一个小的文件上传文件上传的文件三要素首先表单提交的方式要是 post方式,第二个…

Leetcode 剑指 Offer II 080.组合

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定两个整数 n 和 k&#xff0c;返回 1 … n 中所有可能的 k 个…

vue2+antv/x6实现er图

效果图 安装依赖 npm install antv/x6 --save 我目前的项目安装的版本是antv/x6 2.18.1 人狠话不多&#xff0c;直接上代码 <template><div class"er-graph-container"><!-- 画布容器 --><div ref"graphContainerRef" id"gr…

国际荐酒师(香港)协会受邀出席广州意大利国庆晚宴

2024年5月30日&#xff0c;意大利驻广州总领事馆举办的2024年意大利国庆招待会及晚宴&#xff0c;庆祝意大利共和国成立。此次晚宴旨在促进中意两国之间的文化交流与合作。国际荐酒师&#xff08;香港&#xff09;协会受主办方邀请参与了这一重要活动。 国际荐酒师&#xff08;…

内核调度客制化利器:SCHED_EXT

一、前言 今年年初&#xff0c;宋宝华老师发表了一篇对2023年内核技术总结的文章《熠熠生辉 | 2023 年 Linux 内核十大技术革新功能》。有兴趣的伙伴可以点击蓝色字体链接回顾。 文章提及的10个技术中&#xff0c;与CPU任务调度器核心相关的内容&#xff0c;一共有两个&#xf…

痛心!2岁女童被从17楼推下坠亡,凶手疑是未成年

一起又一起的案件&#xff0c; 如同一部沉重的史诗&#xff0c; 无声地述说着一个共同的真理&#xff1a; 严惩恶魔&#xff0c;实则是在庇护着无数纯真的心灵&#xff0c;守护着更多的孩子。 因为每一起案件的背后&#xff0c;都隐藏着一个个令人心碎的故事。 01 近日&#xf…

python编程:实现对数据库中图片文件的查看及比对

当谈到图像查看和管理时,我们往往会使用一些工具软件,比如Windows自带的照片查看器或者第三方工具。那如果你想要一个更加强大和定制化的图像查看器呢?这时候就需要自己动手写一个程序了。 C:\pythoncode\new\ShowSqliteImage.py 这里我们将介绍一个使用Python和wxPython编写…

FPGA-ARM架构与分类

ARM架构&#xff0c;曾称进阶精简指令集机器&#xff08;Advanced RISC Machine&#xff09;更早称作Acorn RISC Machine&#xff0c;是一个32位精简指令集&#xff08;RISC&#xff09;处理器架构。 主要是根据FPGA zynq-7000的芯片编写的知识思维导图总结,废话不多说自取吧 …

【Python内功心法】:深挖内置函数,释放语言潜能

文章目录 &#x1f680;一、常见内置函数&#x1f308;二、高级内置函数⭐1. enumerate函数&#x1f44a;2. eval函数❤️3. exec函数&#x1f4a5;4. eval与exec 中 globals与locals如何用☔4-1 globals 参数&#x1f3ac;4-2 locals 参数 ❤️5. filter函数&#x1f44a;6. z…

Python 之SQLAlchemy使用详细说明

目录 1、SQLAlchemy 1.1、ORM概述 1.2、SQLAlchemy概述 1.3、SQLAlchemy的组成部分 1.4、SQLAlchemy的使用 1.4.1、安装 1.4.2、创建数据库连接 1.4.3、执行原生SQL语句 1.4.4、映射已存在的表 1.4.5、创建表 1.4.5.1、创建表的两种方式 1、使用 Table 类直接创建表…

安卓如何书写注册和登录界面

一、如何跳转一个活动 左边的是本活动名称&#xff0c; 右边的是跳转界面活动名称 Intent intent new Intent(LoginActivity.this, RegisterActivity.class); startActivity(intent); finish(); 二、如果在不同的界面传递参数 //发送消息 SharedPreferences sharedPreferen…

【学习Day4】计算机基础

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; ❤️学习和复习的过程是愉快嘚。 1.7.3 流水线 流水线&#xff08;pipeline&#xff09;技术…

单片机按键处理模块

一 介绍 1.key_board用于单片机中的小巧多功能按键支持&#xff0c;软件采用了分层的思想&#xff0c;并且做到了与平台无关&#xff0c;用户只需要提供按键的基本信息和读写io电平的函数即可&#xff0c;非常方便移植&#xff0c;同时支持多个矩阵键盘及多个单io控制键盘。 …

chap5 CNN

卷积神经网络&#xff08;CNN&#xff09; 问题描述&#xff1a; 利用卷积神经网络&#xff0c;实现对MNIST数据集的分类问题 数据集&#xff1a; MNIST数据集包括60000张训练图片和10000张测试图片。图片样本的数量已经足够训练一个很复杂的模型&#xff08;例如 CNN的深层…