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

2023年 9月 7日 43.5k 0

👨‍🎓作者: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 码绘制为黑色的像素点。最后,它使用 ImageIOBufferedImage 对象写入到指定类型的文件中。

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浏览器(本机默认浏览器)。

image.png

肉眼可见,该网站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电子书籍、简历模板等海量资料。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论