Java实现二维码扫描:从扫码到跳转,快速进入目标网站!

👨‍🎓作者: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编程的基本知识。

js 复制代码
环境说明: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接口,具体如下:

java 复制代码
        <!--二维码扫描工具包-->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.0</version>
        </dependency>

以下是使用Zxing库编写简单的二维码扫描程序的代码:

4.3 实现生成指定网址的二维码图片

我们可以使用ZXing库来生成一个指定网址的二维码图片。下面是我封装好的一个工具类,需要的可自取,可以根据你的需要进行修改或新增。

示例代码如下,仅供参考:

java 复制代码
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<EncodeHintType, Object> hintMap = new HashMap<EncodeHintType, Object>();
        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 码绘制为黑色的像素点。最后,它使用 ImageIOBufferedImage 对象写入到指定类型的文件中。

4.4 实现二维码扫描和跳转网址功能

4.4.1 实现扫描二维码方法

创建一个名为scanQRCode方法类,实现二维码的扫描功能,示例代码如下:

java 复制代码
      /**
     * 读取二维码网址
     */
    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 实现获取图像像素方法

创建一个获取图像像素的方法,示例代码如下:

java 复制代码
    //获取图像的像素数据
    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的操作。 示例代码如下:

java 复制代码
    /**
     * 根据网址跳转
     */
    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()方法,示例如下:

java 复制代码
    /**
     * 测试生成一张指定地址的二维码
     *
     */
    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函数直接调用,示例代码仅供参考;如果一切正常,程序应该可以正确地识别二维码中的网址,并在默认浏览器中打开该网页。示例代码如下:

java 复制代码
    /**
     * 测试二维码读取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. 热文推荐💭

若想学习更多,可以参考这篇专栏总结《2023最新首发,全网最全 Spring Boot 学习宝典(附思维导图)》本专栏致力打造最硬核 Spring Boot 进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中。欢迎大家订阅持续学习。

在入门及进阶之途,我必助你一臂之力,系统性学习,从入门到精通,带你不走弯路,直奔终点;投资自己,永远性价比最高,都这么说了,你还不赶紧来学??

本文涉及所有源代码,均已上传至github开源,供同学们一对一参考 GitHub传送门

同时,原创开源不易,欢迎给个star🌟,想体验下被🌟的感jio,非常感谢❗

6. 文末💭

我是bug菌,CSDN | 阿里云 | 华为云 | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金 | InfoQ | 51CTO等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。

相关推荐
Asthenia041239 分钟前
Spring扩展点与工具类获取容器Bean-基于ApplicationContextAware实现非IOC容器中调用IOC的Bean
后端
bobz9651 小时前
ovs patch port 对比 veth pair
后端
Asthenia04121 小时前
Java受检异常与非受检异常分析
后端
uhakadotcom1 小时前
快速开始使用 n8n
后端·面试·github
JavaGuide1 小时前
公司来的新人用字符串存储日期,被组长怒怼了...
后端·mysql
bobz9652 小时前
qemu 网络使用基础
后端
Asthenia04122 小时前
面试攻略:如何应对 Spring 启动流程的层层追问
后端
Asthenia04122 小时前
Spring 启动流程:比喻表达
后端
Asthenia04123 小时前
Spring 启动流程分析-含时序图
后端
ONE_Gua3 小时前
chromium魔改——CDP(Chrome DevTools Protocol)检测01
前端·后端·爬虫