Java ZXing二维码生成与自定义LOGO集成解决方案

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Java ZXing库是一个开源项目,用于生成和读取多种条码和二维码。本案例介绍了一个Java工具包,利用ZXing库的功能,开发者可以创建带自定义LOGO的二维码。文章将探讨ZXing库的介绍、二维码生成的步骤、自定义LOGO替换方法、BufferedImageLuminanceSource的作用以及使用示例和注意事项,以便开发者能够全面理解如何在Java项目中快速实现此类功能。 java zpxing生成二维码集成包 可换logo

1. ZXing库简介

ZXing ("Zebra Crossing") 是一个开源的、用Java实现的库,它支持多种格式的编码和解码,尤其是用于生成和解析二维码和条形码。这个库广泛应用于各种平台,包括移动设备和桌面应用程序。在本章节中,我们将简要介绍ZXing库的背景以及它的基本使用场景。

ZXing库的背景

ZXing项目起源于2008年,最初是为移动设备设计的。随着条码和二维码技术在移动支付、产品跟踪、用户验证等场景中的应用越来越广泛,ZXing因其高效的编码和解码能力获得了开发者的青睐。ZXing库不仅支持一维条码,如UPC、EAN,还支持二维码格式,如QR Code。

基本使用场景

在日常应用中,ZXing库被广泛用于生成二维码和条形码图像,以及将这些图像解码成文本数据。例如,在电商物流领域,产品包装上的条码能够被扫描和识别,从而快速查询到产品的详细信息;在移动支付领域,二维码能够作为支付凭证,用户仅需扫描二维码即可完成支付。ZXing在这些场景中起到了至关重要的作用。

通过理解ZXing库的基本功能和使用场景,我们可以预见在未来它将在各种应用中扮演更加重要的角色,尤其是在物联网和移动互联网迅速发展的今天。接下来的章节,我们将深入探讨如何利用ZXing库进行二维码的生成和自定义LOGO的集成等高级技术。

2. 二维码生成基础步骤

在上一章中,我们已经对ZXing库有了基本的了解。接下来,我们将深入探讨如何使用ZXing库生成基础二维码。二维码生成的过程并不复杂,但是理解其中的原理和各个步骤对于生成高质量的二维码至关重要。

2.1 二维码生成原理

二维码的生成涉及到数据编码、纠错编码以及最终的图案生成三个主要步骤。让我们逐一深入了解这些步骤。

2.1.1 二维码的数据存储机制

二维码中存储的数据类型多种多样,从简单的文本到网址,再到更复杂的结构化信息。二维码采用特定的编码规则来存储这些数据,主要包括以下几个编码模式:

  • 数字模式:这种模式效率最高,只能用于编码数字0-9。
  • 字母数字模式:可以编码字母和数字的组合。
  • 字符模式:用于编码包括标点符号在内的大部分ASCII字符。
  • 二进制模式:用于编码任意二进制数据。
  • 汉字模式:用于编码汉字和日文假名,效率较低。

二维码通过在水平和垂直方向上编码这些数据来构建其内容。二维码采用一种名为"二维码矩阵"的结构,其中每个小方块(称为"模块")都代表信息的一部分。二维码的设计允许在一定程度上损坏的情况下仍然能够恢复数据,这得益于其强大的纠错机制。

2.1.2 二维码的纠错能力

纠错机制是二维码技术中的另一个关键组成部分。它允许二维码即使在部分损坏的情况下仍然可以被正确读取。纠错级别分为四个等级,分别是L、M、Q和H,纠错能力依次增强,但同时要求的数据量也更大。

纠错数据是通过一种复杂的数学算法生成的,它依赖于输入的数据,以确定哪些位置上的模块用于存储纠错信息。纠错模块和数据模块一起构成了最终的二维码图案。当二维码受到损坏时,通过扫描设备内置的算法,可以重新计算丢失的数据,以确保二维码信息的完整性。

2.2 二维码生成代码实践

现在我们已经了解了二维码生成的原理,接下来让我们通过代码实践来实际生成一个二维码。

2.2.1 引入ZXing库依赖

在Java项目中使用ZXing库之前,需要将ZXing库添加到项目依赖中。如果你使用Maven进行项目管理,可以在pom.xml文件中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>javase</artifactId>
        <version>3.4.1</version>
    </dependency>
</dependencies>

2.2.2 编写生成二维码的代码

以下是一个简单的示例代码,展示了如何使用ZXing库生成包含特定文本信息的二维码:

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.client.j2se.MatrixToImageWriter;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;

public class QrCodeGenerator {
    public static void generateQRCodeImage(String text, int width, int height, String filePath)
            throws WriterException, IOException {
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        // Create the BitMatrix object
        BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);
        // Write the BitMatrix to an image file
        Path path = new File(filePath).toPath();
        MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
    }

    public static void main(String[] args) {
        try {
            generateQRCodeImage("https://www.example.com", 350, 350, "qrcode.png");
            System.out.println("QR Code generated successfully.");
        } catch (WriterException e) {
            System.out.println("Could not generate QR Code, WriterException :: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("Could not generate QR Code, IOException :: " + e.getMessage());
        }
    }
}

在上面的代码中,我们创建了一个 generateQRCodeImage 方法,它接收四个参数:要编码到二维码的文本、二维码图像的宽度和高度以及二维码图像文件的存储路径。我们还指定了字符编码为"UTF-8",以确保国际字符也能被正确编码。

我们使用 MultiFormatWriter 类的 encode 方法来生成一个 BitMatrix 对象,该对象是一个二维的布尔数组,代表二维码的黑点和白点。然后我们使用 MatrixToImageWriter 类将这个矩阵保存为PNG格式的图像文件。

运行上述代码,如果一切正常,你将在指定的路径找到一个名为"qrcode.png"的文件,这就是我们生成的二维码图像。

以上内容介绍了一种生成二维码的最简单方式,同时也展示了如何将ZXing库集成到Java项目中进行二维码的生成。在后续的章节中,我们还将探讨如何生成带有自定义LOGO的二维码,并深入分析二维码生成过程中的最佳实践和性能优化。

3. 自定义LOGO的二维码生成技术

二维码作为信息传递的重要媒介,已经成为日常生活中不可或缺的一部分。随着需求的多样化,用户不仅希望二维码能够传递信息,还希望它能够带有企业的LOGO或个人的标识。这种带有LOGO的二维码不仅美化了视觉效果,也在一定程度上增强了用户的识别度。本章节将深入探讨如何在二维码中集成自定义LOGO,并分析其对二维码识别的影响以及实践步骤。

3.1 LOGO在二维码中的表现形式

3.1.1 LOGO尺寸和二维码的关系

将LOGO嵌入二维码时,需要考虑LOGO的尺寸和二维码的尺寸关系。LOGO太大可能会遮盖二维码的关键部分,从而降低扫描的成功率。相反,如果LOGO太小,则可能无法起到明显的标识作用。因此,合理选择LOGO的尺寸至关重要。

一个有效的办法是先生成一个尺寸较小的二维码,然后在二维码的中心位置留出一部分区域用于放置LOGO。这样既可以保证LOGO的辨识度,也可以保证二维码的可读性。通常,二维码中心的一定比例(如10%-20%)用于放置LOGO是较为合适的选择。

3.1.2 LOGO对二维码识别的影响

LOGO的加入可能会对二维码的识别造成一定的干扰。一方面,LOGO的图案可能与二维码的某些图案产生冲突,导致扫描设备无法正确识别;另一方面,LOGO的颜色也可能与二维码的某些颜色模式产生冲突。

为减少干扰,通常会采取以下措施:

  • 对LOGO进行灰度处理,以便与二维码的黑色和白色相适应。
  • 调整LOGO的透明度,确保LOGO区域不会完全覆盖二维码的编码数据。
  • 使用二维码识别软件或库,进行多次测试,不断优化LOGO与二维码的融合。

3.2 LOGO集成实践

3.2.1 LOGO的预处理

为了确保LOGO与二维码能够正确融合,首先需要对LOGO进行预处理。以下是一个简单的LOGO预处理代码示例:

BufferedImage logoImage = ImageIO.read(new File("logo.png"));
BufferedImage resizedLogo = new BufferedImage(logoSize, logoSize, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = resizedLogo.createGraphics();
g.drawImage(logoImage, 0, 0, logoSize, logoSize, null);
g.dispose();
ImageIcon imageIcon = new ImageIcon(resizedLogo);

// 将LOGO转换为灰度图
ColorConvertOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
BufferedImage grayLogo = new BufferedImage(logoSize, logoSize, BufferedImage.TYPE_INT_ARGB);
op.filter(resizedLogo, grayLogo);

在上述代码中,首先将LOGO图片读入并调整大小,然后将其转换为灰度图像以减少颜色干扰。

3.2.2 在二维码中心集成LOGO

集成LOGO到二维码中心是一个常见需求。以下是实现该功能的代码片段,其中使用了ZXing库生成二维码,并将预处理后的LOGO嵌入到二维码中心:

QRCodeWriter qrCodeWriter = new QRCodeWriter();
Map<EncodeHintType, Object> hints = new EnumMap<>(EncodeHintType.class);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE,QuietZone);
int width =QuietZone;
int height =QuietZone;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
    for (int y = 0; y < height; y++) {
        image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK_COLOR : WHITE_COLOR);
    }
}
Graphics2D g = image.createGraphics();
// 绘制LOGO到二维码中心
g.drawImage(grayLogo,QuietZone/2 - logoSize/2,QuietZone/2 - logoSize/2,logoSize,logoSize, null);
g.dispose();

// 输出二维码图片
File outputfile = new File("QRCode.png");
ImageIO.write(image, "png", outputfile);

在代码中,我们使用了 Graphics2D 来绘制LOGO。首先,我们创建了一个 BufferedImage 对象,然后在该对象上使用 Graphics2D 绘制二维码和LOGO。

需要注意的是,代码中的 QuietZone 代表二维码四周的空白区域,而 logoSize 代表LOGO的大小。为了确保LOGO能够居中显示,我们在绘制LOGO时使用了适当的偏移量( QuietZone/2 - logoSize/2 )。

经过上述步骤,我们可以生成一个带有自定义LOGO的二维码图片。通过这种方式,我们不仅实现了个性化的需求,同时也确保了二维码的可用性。在下一章节中,我们将深入探讨BufferedImageLuminanceSource类的作用以及如何优化二维码的质量。

4. BufferedImageLuminanceSource的作用

4.1 BufferedImageLuminanceSource类解析

4.1.1 类的结构和关键方法

BufferedImageLuminanceSource 是ZXing库中的一个核心类,用于将 BufferedImage 转换成适合二维码识别的灰度图像源。这个类的结构简洁,其主要作用是通过处理图像的亮度值来生成对应的灰度图像,从而提高二维码的识别效果。

类的主要方法包括: - 构造函数:接收 BufferedImage 对象,初始化类的实例。 - getData() 方法:返回图像数据的二维数组,数组中的每个元素代表对应像素的灰度值。 - getMatrix() 方法:提供对图像矩阵的直接访问。 - isRotateForFinalImage() 方法:指示是否需要在最终图像中旋转。

每个方法都针对图像处理过程中的特定需求进行了优化,保证了生成的灰度图像既准确又高效。

4.1.2 如何使用BufferedImageLuminanceSource类

要使用 BufferedImageLuminanceSource 类,首先需要有 BufferedImage 对象作为输入。假设我们已经有一个二维码的 BufferedImage 图像,下面是如何将这个图像转换为 BufferedImageLuminanceSource 并处理的步骤:

BufferedImage image = ...; // 已有的二维码BufferedImage对象
BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
Binarizer binarizer = new HybridBinarizer(source);
BinaryBitmap bitmap = new BinaryBitmap(binarizer);

在上述代码中,首先创建了一个 BufferedImageLuminanceSource 的实例,然后使用 HybridBinarizer 对图像数据进行二值化处理,最终生成 BinaryBitmap 对象,该对象用于后续的二维码解析。

4.2 图像处理与二维码质量优化

4.2.1 图像缩放和转换技巧

在处理图像以优化二维码质量时,图像的缩放和转换是两个非常重要的环节。适当的图像处理可以显著提高二维码的扫描成功率。

缩放图像时要保持长宽比不变,防止二维码产生变形。ZXing库提供了缩放功能,允许用户在不损失图像质量的前提下调整图像大小:

PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(...);
PlanarYUVLuminanceSource scaledSource = source.createScaledImage(...);

转换技巧中,二维码图像的色彩深度也是一个重要的考虑因素。通常情况下,二维码识别更偏好灰度图像,因为灰度图像的对比度更高,有助于识别二维码的边缘和图案。

4.2.2 提高二维码扫描成功率的方法

提高二维码扫描成功率不仅仅是图像处理的问题,还包括了二维码的编码质量、环境光线、扫描设备的性能等因素。下面是一些提高成功率的方法:

  1. 选择合适的二维码版本和纠错级别,这可以确保在有损坏的情况下,二维码仍然能够被正确解码。
  2. 确保二维码的打印质量高,避免出现模糊不清的情况。
  3. 在二维码的四周留出空白区域,避免周围的图案或者文字干扰识别。
  4. 适当调整扫描设备的曝光和对比度设置,尤其是使用手机扫描时,不同的曝光值可能会影响识别效率。

使用ZXing库时,我们可以调用相应的编码接口,设置合适的参数来生成高质量的二维码,同时结合 BufferedImageLuminanceSource 类处理图像,以获得最优的扫描成功率。

5. Java项目中二维码生成的使用示例

在这一章节中,我们将深入探讨如何将二维码生成技术应用于实际的Java项目中,包括Web应用和桌面应用。我们将介绍如何在不同类型的Java项目中集成二维码生成功能,包括使用的库、实践方法以及遇到的一些常见问题和解决策略。

5.1 在Web应用中集成二维码生成

5.1.1 Servlet和二维码生成集成

在Java Web应用中,一个常用的集成二维码生成的方式是通过Servlet。首先,需要在项目中引入ZXing库的依赖。然后,创建一个Servlet来处理二维码生成的逻辑,并提供生成二维码的接口。

下面是一个简单的示例代码,展示了如何使用ZXing库在Servlet中生成二维码:

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/generateQRCode")
public class QRCodeServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            // 设置二维码参数
            Map<EncodeHintType, Object> hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

            // 生成二维码矩阵
            BitMatrix bitMatrix = new MultiFormatWriter().encode(
                "http://example.com", BarcodeFormat.QR_CODE, 250, 250, hints);

            // 将二维码矩阵保存为图片
            String filePath = FileSystems.getDefault().getPath("/tmp", "QRCode.png");
            MatrixToImageWriter.writeToPath(bitMatrix, "PNG", filePath);

            // 输出二维码图片到客户端
            response.setContentType("image/png");
            Files.copy(filePath, response.getOutputStream());
        } catch (WriterException e) {
            throw new ServletException("Failed to generate QRCode", e);
        }
    }
}

这个Servlet接收到请求后,会生成一个指向"http://example.com"的二维码,并将其作为PNG图片流发送到客户端。

5.1.2 Spring MVC中的二维码生成实践

在Spring MVC框架中,可以通过REST API来提供二维码生成服务。使用 @RestController 注解创建一个控制器,然后使用 @GetMapping @PostMapping 注解定义二维码生成的接口。

下面是一个简单的Spring MVC控制器示例:

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@RestController
public class QRCodeController {

    @GetMapping("/generateQRCode")
    public byte[] generateQRCode(String content) throws WriterException, IOException {
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, 250, 250, hints);

        BufferedImage qrImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
        ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();
        ImageIO.write(qrImage, "png", pngOutputStream);

        return pngOutputStream.toByteArray();
    }
}

在这个例子中,通过发送HTTP GET请求到 /generateQRCode 端点,并带上参数 content ,就可以得到对应内容的二维码图片的字节流。

5.2 在桌面应用中集成二维码生成

5.2.1 Java Swing应用中的二维码生成

在Swing桌面应用中,生成二维码通常涉及到图形用户界面和后台生成逻辑的交互。我们可以在Swing应用中创建一个按钮,当用户点击按钮时,生成二维码并显示在界面上。

下面是一个使用Swing组件生成二维码的简单示例:

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class QRCodeSwingExample {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("QR Code Example");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(400, 400);

            JButton generateButton = new JButton("Generate QR Code");
            generateButton.addActionListener(e -> {
                try {
                    BufferedImage qrImage = generateQRCodeImage("http://example.com");
                    ImageIcon icon = new ImageIcon(qrImage);
                    JLabel label = new JLabel(icon);
                    frame.add(label, BorderLayout.CENTER);
                    frame.setVisible(true);
                } catch (WriterException | IOException ex) {
                    ex.printStackTrace();
                }
            });

            frame.add(generateButton, BorderLayout.SOUTH);
            frame.setVisible(true);
        });
    }

    private static BufferedImage generateQRCodeImage(String content) throws WriterException, IOException {
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

        BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, 250, 250, hints);
        return MatrixToImageWriter.toBufferedImage(bitMatrix);
    }
}

在这个例子中,我们创建了一个窗口,其中包含一个按钮。当用户点击按钮时,会触发二维码的生成,并将生成的二维码图像显示在窗口中。

5.2.2 JavaFX应用中的二维码生成

在JavaFX应用中,生成二维码的过程与Swing类似,不过使用的是JavaFX的组件。下面是一个简单的示例,展示了如何在JavaFX应用中集成二维码生成:

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class QRCodeJavaFXExample extends Application {

    @Override
    public void start(Stage primaryStage) {
        Button generateButton = new Button("Generate QR Code");
        generateButton.setOnAction(event -> {
            try {
                BufferedImage qrImage = generateQRCodeImage("http://example.com");
                Image qrJavaFXImage = SwingFXUtils.toFXImage(qrImage, null);
                ImageView qrImageView = new ImageView(qrJavaFXImage);
                StackPane root = new StackPane();
                root.getChildren().add(qrImageView);
                primaryStage.setScene(new Scene(root, 400, 400));
                primaryStage.show();
            } catch (WriterException | IOException e) {
                e.printStackTrace();
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(generateButton);
        Scene scene = new Scene(root, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private static BufferedImage generateQRCodeImage(String content) throws WriterException, IOException {
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

        BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, 250, 250, hints);
        return MatrixToImageWriter.toBufferedImage(bitMatrix);
    }

    public static void main(String[] args) {
        launch(args);
    }
}

在这个例子中,当用户点击按钮后,会在JavaFX的Stage中显示一个ImageView组件,其中包含生成的二维码图像。

在实际的Java项目中,可能还会涉及到其他的集成问题和解决策略,比如异步处理二维码生成任务,优化内存使用等。总的来说,通过Java的Servlet、Spring MVC、Swing和JavaFX等技术,我们可以轻松地将二维码生成功能集成到Web和桌面应用中,满足各种应用场景的需求。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Java ZXing库是一个开源项目,用于生成和读取多种条码和二维码。本案例介绍了一个Java工具包,利用ZXing库的功能,开发者可以创建带自定义LOGO的二维码。文章将探讨ZXing库的介绍、二维码生成的步骤、自定义LOGO替换方法、BufferedImageLuminanceSource的作用以及使用示例和注意事项,以便开发者能够全面理解如何在Java项目中快速实现此类功能。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值