📜  从图像中读取二维码 java (1)

📅  最后修改于: 2023-12-03 15:36:17.027000             🧑  作者: Mango

从图像中读取二维码

如果你需要从图像中读取二维码信息,Java 提供了许多库和工具来实现这个功能。在本文中,我们将介绍如何使用 ZXing 库来从图像中读取二维码。

ZXing

ZXing("Zebra Crossing")是一个用 Java 开发的开源库,能够识别各种标准格式的二维码(QR Code、Data Matrix 等)。它还能生成二维码,并支持多种编程语言。

安装 ZXing

你需要下载 ZXing 库,将其添加到你的项目中。你可以从 官方仓库Maven 中央仓库 下载 ZXing 核心库(Core)。

Maven

如果你使用 Maven,可以在 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.3.3</version>
</dependency>
Gradle

如果你使用 Gradle,可以在 build.gradle 中添加以下依赖项:

dependencies {
    implementation 'com.google.zxing:core:3.3.3'
}
读取二维码

在本文中,我们将介绍从文件和 BufferedImage 中读取二维码的方式。在每个示例中,我们将使用 MultiFormatReader 类来解码图像中的二维码。

从文件中读取

以下示例展示了如何使用 MultiFormatReader 类从文件中读取二维码:

import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.NotFoundException;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class QRCodeReaderExample {

    public static void main(String[] args) {
        try {
            String filePath = "/path/to/your/image.png";
            File qrCodeFile = new File(filePath);
            BufferedImage bufferedImage = ImageIO.read(qrCodeFile);
            decodeQRCode(bufferedImage);
        } catch (IOException e) {
            System.out.println("Could not read QR Code file: " + e.getMessage());
        }
    }

    private static void decodeQRCode(BufferedImage bufferedImage) {
        MultiFormatReader barcodeReader = new MultiFormatReader();
        try {
            com.google.zxing.Result result = barcodeReader.decode(new com.google.zxing.BinaryBitmap(new com.google.zxing.RGBLuminanceSource(bufferedImage, bufferedImage.getWidth(), bufferedImage.getHeight(), null)));
            System.out.println("二维码内容: " + result.getText());
        } catch (NotFoundException e) {
            System.out.println("Could not decode QR Code: " + e.getMessage());
        }
    }
}
从 BufferedImage 中读取

以下示例展示了如何使用 MultiFormatReader 类从 BufferedImage 中读取二维码:

import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.NotFoundException;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class QRCodeReaderExample {

    public static void main(String[] args) {
        try {
            BufferedImage bufferedImage = ImageIO.read(new File("/path/to/your/image.png"));
            decodeQRCode(bufferedImage);
        } catch (IOException e) {
            System.out.println("Could not read QR Code file: " + e.getMessage());
        }
    }

    private static void decodeQRCode(BufferedImage bufferedImage) {
        MultiFormatReader barcodeReader = new MultiFormatReader();
        try {
            com.google.zxing.Result result = barcodeReader.decode(new com.google.zxing.BinaryBitmap(new com.google.zxing.RGBLuminanceSource(bufferedImage, bufferedImage.getWidth(), bufferedImage.getHeight(), null)));
            System.out.println("二维码内容: " + result.getText());
        } catch (NotFoundException e) {
            System.out.println("Could not decode QR Code: " + e.getMessage());
        }
    }
}

以上就是使用 ZXing 库从图像中读取二维码的方式。请注意,为了避免抛出 NotFoundException 异常,你的图像必须具有足够的清晰度和对比度。