👨🎓作者:bug菌
✏️博客:CSDN、掘金、infoQ、51CTO等
🎉简介:CSDN | 阿里云 | 华为云 | 51CTO等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金 | InfoQ | 51CTO等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。...
✍️温馨提醒:本文字数:9999字, 阅读完需:约 15 分钟
1. 前言
二维码扫描在现代日常生活中已经得到了广泛的应用,例如通过扫描餐厅的二维码来查看菜单、扫描商店的二维码来获取优惠券等等,这些都需要实现二维码扫描后跳转到相应的网址。本教程将介绍如何使用Java实现二维码扫描后跳转网址。
那么,具体如何实现呢?这将又会是干货满满的一期,全程无尿点不废话只抓重点教,具有非常好的学习效果,拿好小板凳准备就坐!希望学习的过程中大家认真听好好学,学习的途中有任何不清楚或疑问的地方皆可评论区留言或私信,bug菌将第一时间给予解惑,那么废话不多说,直接开整!Fighting!!
🏆本文收录于《Java进阶实战》,专门攻坚指数提升,2023 年国内最系统+最强(更新中)。
2. 摘要
本教程将介绍如何使用Java编程实现将二维码扫描后跳转网页的功能。主要内容包括:
- 二维码的概念和原理
- 二维码的创建
- 二维码的扫描
- 根据扫描URL跳转网页
- 测试用例和全文小结
提示:本教程旨在为初学者提供参考和帮助,读者需要具备Java编程的基本知识。
环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE
3. 二维码
3.1 二维码的概念和原理
二维码是一种可以存储信息的二维图像,通常由黑白相间的小正方形组成。通过扫描二维码,可以将其中存储的信息快速读取出来,例如网址、文本、图片等。
二维码的实现原理主要是通过将信息编码成一组特定的格式,然后按照一定规则绘制成图像。在扫描二维码时,通过解析图像上的黑白像素信息,可以将编码的信息还原出来。常见的二维码格式有QR码、DataMatrix码、PDF417码等。
3.2 使用Java编写二维码扫描程序
Java中可以使用Zxing
库来编写二维码扫描程序,该库提供了一系列用于生成和解析二维码的API接口。zxing源码地址:github.com/zxing/zxing
4. 正文
4.1 搭建Spring Boot应用
首先,我们先创建个基础的Spring Boot项目,如果还不会点这里,此处就不详细赘述啦。
4.2 导入依赖
这里我们采用Zxing
库来编写二维码扫描程序,该库提供了一系列用于生成和解析二维码的API接口,具体如下:
com.google.zxing
core
3.3.0
以下是使用Zxing
库编写简单的二维码扫描程序的代码:
4.3 实现生成指定网址的二维码图片
我们可以使用ZXing
库来生成一个指定网址的二维码图片。下面是我封装好的一个工具类,需要的可自取,可以根据你的需要进行修改或新增。
示例代码如下,仅供参考:
package com.example.springboothttp.util;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import javax.imageio.ImageIO;
import com.google.zxing.*;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeWriter;
/**
* 二维码相关工具方法
*
* @author bug菌
* @version 1.0
* @date 2023/9/5 15:25
*/
public class QRCodeUtil {
/**
* 生成指定网址大小及图片格式的二维码
*
* @param url 网址
* @param size 尺寸
* @param fileType 二维码图片格式
* @param qrFile 生成图片保存地址
*/
private static void createQRCode(String url, int size, String fileType, File qrFile)
throws WriterException, IOException {
HashMap hintMap = new HashMap();
hintMap.put(EncodeHintType.CHARACTER_SET, "UTF-8");
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(url, BarcodeFormat.QR_CODE, size, size, hintMap);
int matrixWidth = bitMatrix.getWidth();
BufferedImage image = new BufferedImage(matrixWidth, matrixWidth, BufferedImage.TYPE_INT_RGB);
image.createGraphics();
Graphics2D graphics = (Graphics2D) image.getGraphics();
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, matrixWidth, matrixWidth);
graphics.setColor(Color.BLACK);
for (int i = 0; i < matrixWidth; i++) {
for (int j = 0; j < matrixWidth; j++) {
if (bitMatrix.get(i, j)) {
graphics.fillRect(i, j, 1, 1);
}
}
}
ImageIO.write(image, fileType, qrFile);
}
}
方法解读:此方法接受一个 URL、一个尺寸、一个文件类型和一个文件对象作为参数。在内部,它使用 QRCodeWriter
类和 BitMatrix
类来生成一个 QR 码的二进制矩阵,并将其转换为一个 BufferedImage
对象。然后,它在 BufferedImage
上创建一个 Graphics2D
对象以将 QR 码绘制为黑色的像素点。最后,它使用 ImageIO
将 BufferedImage
对象写入到指定类型的文件中。
4.4 实现二维码扫描和跳转网址功能
4.4.1 实现扫描二维码方法
创建一个名为scanQRCode方法类,实现二维码的扫描功能,示例代码如下:
/**
* 读取二维码网址
*/
public static String scanQRCode(String filePath) {
String url = "";
try {
File file = new File(filePath);
BufferedImage image = ImageIO.read(file);
LuminanceSource source = new RGBLuminanceSource(image.getWidth(), image.getHeight(), getPixels(image));
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Result result = new MultiFormatReader().decode(bitmap);
url = result.getText();
System.out.println("二维码中的网址为:" + url);
} catch (IOException | ReaderException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return url;
}
方法解读:scanQRCode(String filePath)
方法接收一个文件路径参数,它会读取该文件,并将其转换成 BufferedImage
对象。接着,创建一个 LuminanceSource
源对象,并使用 RGBLuminanceSource
类从 BufferedImage
对象中获取像素数据。然后,使用 HybridBinarizer
类创建 BinaryBitmap
对象,用于表示二值化后的图像,也就是只有黑和白两种颜色的图像。接着,使用 MultiFormatReader
类解码 BinaryBitmap
对象,解析出其中的信息,并将其打印出来。
4.4.2 实现获取图像像素方法
创建一个获取图像像素的方法,示例代码如下:
//获取图像的像素数据
private int[] getPixels(BufferedImage image) {
int width = image.getWidth();
int height = image.getHeight();
int[] pixels = new int[width * height];
image.getRGB(0, 0, width, height, pixels, 0, width);
return pixels;
}
方法解读:getPixels(BufferedImage image)
是一个辅助方法,用于从 BufferedImage
对象中获取像素数据。它首先获取图像的宽度和高度,然后创建一个像素数组,并使用 getRGB()
方法从 BufferedImage
对象中获取像素数据,把它存储在像素数组中,并返回该数组。
4.4.3 实现网址跳转功能
采用Java中调用默认浏览器打开指定URL的代码。Desktop
是Java中的一个类,它提供了一些与操作系统桌面交互的功能,如打开文件、打开URL等。getDesktop()
方法返回默认的桌面实例。browse(new URI(url))
方法则是在默认浏览器中打开指定URL的操作。
示例代码如下:
/**
* 根据网址跳转
*/
public static void dropUrl(String url) {
try {
//调用系统默认浏览器打开指定URL
Desktop.getDesktop().browse(new URI(url));
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
4.5 功能测试
4.5.1 测试生成二维码图片
为了测试我们的程序是否可以正确识别和跳转网页,我们先创建一张附带博客地址的二维码,由于平台限制,二维码样例需要的就从我的Github中获取吧,你可以根据自己的需求调整为自己的。需要注意的是,生成的链接一定要带上http://
或 https://
表明这是链接,而不是一段文字。
在main方法中调用createQRCode()
方法,示例如下:
/**
* 测试生成一张指定地址的二维码
*
*/
public static void main(String[] args) {
String url = "https://blog.csdn.net/weixin_43970743?type=blog";
int size = 300;
String fileType = "png";
File qrFile = new File("./template/csdnQrcode.png");
try {
//调用生成二维码
createQRCode(url, size, fileType, qrFile);
System.out.println("QR code generated successfully!");
} catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
测试结果如下:
指定网址的二维码图片已经生成好了,接着就是测试读取二维码获取网址并打开跳转。
4.5.2 测试扫描二维码并跳转URL
我们拿刚才生成的二维码图片作为演示,写个main
函数直接调用,示例代码仅供参考;如果一切正常,程序应该可以正确地识别二维码中的网址,并在默认浏览器中打开该网页。示例代码如下:
/**
* 测试二维码读取url进行跳转
*/
public static void main(String[] args) {
//传入一张二维码图片地址
String filePath = "./template/csdnQrcode.png";
//读取二维码url
String url = QRCodeUtil.scanQRCode(filePath);
//浏览器打开
QRCodeUtil.dropUrl(url);
}
执行结果如下:
main
函数执行完成的瞬间会调出你系统的默认浏览器,并打开了读取到的网址:
如下就是将二维码指定的URL
打开了QQ浏览器(本机默认浏览器)。
肉眼可见,该网站URL就是我们当初生成二维码所指定的网址,大功告成。
4.6 小结
本教程介绍了如何使用Java编程实现将二维码扫描后跳转网页的功能。我们首先介绍了二维码的概念和原理,然后使用Zxing库编写了简单的二维码扫描程序,并最终实现了跳转网页的功能。通过本教程的学习,读者可以了解相关技术的实现原理,掌握相关的编程技能,为未来的工作和学习打下坚实的基础。
... ...
ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看如下的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬。
「赠人玫瑰,手留余香」,咱们下期拜拜~~
5. 热文推荐💭
-
Java大揭秘:如何轻松获取客户端真实公网IP地址?
-
Java数据库连接:手写代码实现MySQL或Oracle连接并操作数据
-
对比Mysql和Oracle分页:哪个更快、更有效?
-
惊!为什么Java中print和println输出对象时会泄露内存地址?
-
MyBatis中如何使用discriminator鉴别器实现多态查询?
-
教你如何轻松实现三个线程的有序执行!
-
JavaSE中compare与compareTo的比较:挑战自己的“排序神经
-
锁定线程,提升并发性能——解析synchronized关键字的使用方法
-
一招制敌,快速实现单例类
-
单例类中的volatile关键字:保证线程安全的必要手段
-
...
如果还想学习更多,推荐你学习《Java进阶实战》,本专栏致力打造最硬核Java系列进阶学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。
在入门及进阶之途,我必助你一臂之力,系统性学习,从入门到精通,带你不走弯路,直奔终点;投资自己,永远性价比最高,都这么说了,你还不赶紧来学??
本文涉及所有源代码,均已上传至github开源,供同学们一对一参考 GitHub传送门,
同时,原创开源不易,欢迎给个star🌟,想体验下被🌟的感jio,非常感谢❗
6. 文末💭
我是bug菌,CSDN | 阿里云 | 华为云 | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金 | InfoQ | 51CTO等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。