C/C++ 集成ZBar库实战:从环境搭建到二维码与条形码高效识别(附完整代码与避坑指南)

SSE指令集简记 SSE?SSE(为Streaming SIMD Extensions的缩写)是由 Intel公司,在1999年推出Pentium III处理器时,同时推出的新指令集。如同其名称所表示的,SSE是一种SIMD指令集。所谓的SIMD是指single instruction, multiple data,也就是一个指令同时对多个资料进行相同的动作。较早的MMX和 AMD的3DNow!也都是SIMD指令集。 阅读详情

1. 环境准备:搞定ZBar库的安装与配置

作为一位在AI和智能硬件领域摸爬滚打十多年的老程序员,我深知环境配置是很多开发者的第一道坎。记得第一次用ZBar时,光是折腾环境就花了大半天时间,今天我就把最省事的配置方法分享给大家。

ZBar库默认只提供32位版本,这对现代64位开发环境来说确实有点头疼。不过别担心,我已经帮你找到了完美的64位补丁方案。首先去ZBar官网下载基础安装包,这个步骤很简单,直接到sourceforge网站搜索ZBar就能找到。安装时记得勾选"Development Headers and Libraries"选项,这样才能获得开发所需的头文件和库文件。

提示:安装路径建议选择没有空格和特殊字符的目录,比如直接装在D:\ZBar,这样可以避免很多不必要的路径问题。

32位环境配置相对简单,只需要在VS2019中设置包含目录、库目录和附加依赖项就行了。但现实开发中我们更需要64位环境,这就需要用到GitHub上的ZBarWin64项目。把这个项目的libzbar64-0.lib和libzbar64-0.dll文件复制到ZBar安装目录下对应的文件夹,然后在VS配置中添加libzbar64-0.lib这个附加依赖项。

我实测过好几次,这种方法在VS2019上非常稳定。不过要注意的是,32位和64位的配置最好不要混用,建议为不同的平台创建单独的属性表,这样切换起来更方便。

2. VS2019项目配置详解

配置开发环境就像搭积木,每一步都要稳稳当当。我在实际项目中总结出了一套可靠的配置流程,跟着做就能避免大多数坑。

首先新建一个C++控制台项目,我习惯用空项目模板,这样更干净。关键步骤是在属性管理器中创建新的属性表,专门用于ZBar配置。这样做的好处是以后新建项目时可以直接导入这个属性表,省去重复配置的麻烦。

在VC++目录的包含目录中添加ZBar的include文件夹路径,比如D:\ZBar\include。库目录则添加lib文件夹路径。这两个步骤确保编译器能找到所需的头文件和库文件。

链接器配置是关键环节:在附加依赖项中添加libzbar-0.lib(32位)或libzbar64-0.lib(64位)。这里有个小技巧——如果你同时配置了32位和64位,可以用宏条件来自动选择对应的库文件:

$(PlatformName) == 'Win32' ? 'libzbar-0.lib' : 'libzbar64-0.lib'

为了避免运行时出现dll找不到的错误,最好把ZBar的bin目录添加到系统PATH环境变量中。或者更简单的做法是把所需的dll文件直接复制到项目输出目录中。我通常采用后一种方法,这样打包发布时不会遗漏依赖文件。

注意:配置完成后一定要保存属性表,建议命名为ZBarSettings.props,这样其他项目也能重用这个配置。

3. 编写二维码识别代码

代码实现部分其实比想象中简单,ZBar的API设计得很直观。我先给大家展示一个完整的示例,然后再详细解释每个步骤的作用。

#include <iostream>
#include <zbar.h>
#include <opencv2/opencv.hpp>

int main() {
    // 初始化扫描器
    zbar::ImageScanner scanner;
    scanner.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, 1);
    
    // 读取图像文件
    cv::Mat image = cv::imread("qrcode.jpg");
    if (image.empty()) {
        std::cout << "无法读取图像文件" << std::endl;
        return -1;
    }
    
    // 转换为灰度图
    cv::Mat grayImage;
    cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);
    
    // 准备ZBar图像数据
    int width = grayImage.cols;
    int height = grayImage.rows;
    uchar* rawData = grayImage.data;
    
    zbar::Image zbarImage(width, height, "Y800", rawData, width * height);
    
    // 执行扫描
    int result = scanner.scan(zbarImage);
    if (result < 0) {
        std::cout << "扫描失败" << std::endl;
        return -1;
    }
    
    // 处理扫描结果
    if (zbarImage.symbol_begin() == zbarImage.symbol_end()) {
        std::cout << "未检测到条码" << std::endl;
    } else {
        for (zbar::Image::SymbolIterator symbol = zbarImage.symbol_begin();
             symbol != zbarImage.symbol_end(); ++symbol) {
            std::cout << "条码类型: " << symbol->get_type_name() << std::endl;
            std::cout << "条码内容: " << symbol->get_data() << std::endl;
        }
    }
    
    // 显示图像
    cv::imshow("扫描结果", image);
    cv::waitKey(0);
    
    return 0;
}

这段代码的逻辑很清晰:先初始化扫描器,然后读取图像并转换为灰度格式,ZBar需要灰度图像数据。创建zbar::Image对象时指定格式为"Y800",这是ZBar支持的灰度图像格式。

扫描完成后,我们遍历所有识别到的符号(条码或二维码),输出类型和内容信息。实际使用中,你可能需要根据不同的条码类型做进一步处理,比如QR码通常是文本内容,而商品条码可能是数字编码。

4. 常见问题与解决方案

踩坑是成长的必经之路,我在使用ZBar过程中遇到过各种奇怪的问题,这里把最常见的几个问题和解决方法分享给大家。

第一个经典问题是"无法打开源文件stdafx.h"。这是因为新版的VS2019默认不使用预编译头文件,而老代码中可能还保留着这个引用。解决方法很简单:在项目属性 -> C/C++ -> 预编译头中,选择"不使用预编译头",然后删除代码中的#include "stdafx.h"行。

第二个常见问题是链接错误LNK1181,提示找不到lib文件。这通常是因为库路径配置不正确或者平台架构不匹配。首先检查属性表中的库目录路径是否正确,然后确认你使用的是32位还是64位的库文件。有时候还需要手动将lib文件复制到项目目录下。

运行时如果出现"找不到dll"的错误,最简单的解决方法是将ZBar的bin目录下的所有dll文件复制到项目的输出目录(通常是Debug或Release文件夹)。我习惯在项目属性 -> 生成事件 -> 后期生成事件中添加复制命令,这样每次编译时自动复制所需的dll文件。

还有一个不太常见但很棘手的问题是图像格式转换错误。ZBar对图像格式有特定要求,必须是灰度图像且数据布局要符合要求。如果遇到识别率低的情况,可以尝试对图像进行预处理,比如调整对比度、降噪或二值化。

经验分享:我在实际项目中发现,ZBar对QR码的识别效果很好,但对一些特殊格式的条码可能需要调整扫描参数。可以通过set_config方法针对特定类型的条码进行优化配置。

5. 性能优化与实战技巧

让识别程序既快又稳是需要一些技巧的。经过多个项目的实践,我总结出了一套优化方案,能让ZBar的识别效率提升不少。

首先在图像预处理阶段,适当降低图像分辨率可以显著提高识别速度。特别是处理视频流时,没必要对每一帧都进行全分辨率识别。我通常先将图像缩放到800x600左右的分辨率,这个尺寸在识别率和处理速度之间取得了很好的平衡。

// 图像缩放预处理
cv::Mat resizedImage;
cv::resize(grayImage, resizedImage, cv::Size(800, 600));

对于实时视频流处理,可以采用区域兴趣(ROI)扫描策略。先检测可能包含条码的区域,然后只对这些区域进行详细识别。这样能大幅减少计算量,提高实时性。

ZBar支持多种条码类型的配置,如果你只需要识别特定类型的条码(比如只识别QR码),可以禁用其他类型的检测,这样能提高识别速度和准确率:

// 只启用QR码检测
scanner.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, 0);
scanner.set_config(zbar::ZBAR_QRCODE, zbar::ZBAR_CFG_ENABLE, 1);

内存管理也是需要注意的环节。在处理大量图像时,要及时释放不再使用的zbar::Image对象,避免内存泄漏。ZBar使用引用计数机制管理内存,但最好还是显式地调用destroy方法释放资源。

在实际部署时,建议添加异常处理机制。特别是图像文件可能损坏或者格式不支持,良好的错误处理能让程序更加健壮:

try {
    // 识别代码
} catch (const std::exception& e) {
    std::cout << "识别过程出错: " << e.what() << std::endl;
}

6. 扩展应用:结合OpenCV实现高级功能

单纯识别条码可能还不够,在实际项目中我们经常需要与其他计算机视觉技术结合。OpenCV是个很好的选择,它与ZBar配合使用能实现更强大的功能。

比如在复杂背景下识别条码,可以先使用OpenCV进行图像预处理:

// 增强对比度
cv::Mat enhancedImage;
cv::equalizeHist(grayImage, enhancedImage);

// 降噪处理
cv::GaussianBlur(enhancedImage, enhancedImage, cv::Size(3, 3), 0);

对于倾斜的条码,可以先进行角度校正再识别。OpenCV的仿射变换功能很适合这种场景:

// 检测条码区域并校正角度
std::vector<cv::Point2f> corners = detectBarcodeCorners(image);
if (corners.size() == 4) {
    cv::Mat corrected = correctPerspective(image, corners);
    // 对校正后的图像进行识别
}

另一个实用的功能是实时视频流处理。结合OpenCV的视频捕获功能,可以打造一个实时的条码扫描器:

cv::VideoCapture cap(0);
if (!cap.isOpened()) {
    std::cout << "无法打开摄像头" << std::endl;
    return -1;
}

while (true) {
    cv::Mat frame;
    cap >> frame;
    
    // 处理当前帧
    processFrame(frame);
    
    if (cv::waitKey(1) == 27) break; // ESC键退出
}

在实际项目中,我还经常需要将识别结果保存到数据库或者通过网络传输。这时就需要考虑数据格式转换和编码处理:

// 将识别结果转换为JSON格式
std::string resultToJson(const zbar::Symbol& symbol) {
    return "{\"type\":\"" + symbol.get_type_name() + 
           "\",\"data\":\"" + symbol.get_data() + "\"}";
}

这些扩展功能让ZBar不再只是一个简单的识别库,而成为了整个业务流程的重要组成部分。根据我的经验,良好的架构设计能让后续的功能扩展变得容易很多。

记得在某个智能仓储项目中,我们就是基于ZBar和OpenCV开发了一套完整的物料管理系统。从最初的条码识别,逐步扩展到库存管理、物流跟踪等多个功能模块,ZBar的稳定表现让我们省心不少。

树莓派python实现二维码识别——ZBar 在本文中,采用树莓派进行二维码识别,支持中英文的二维码或者一维条码的识别。硬件由树莓派3Bplus和usb摄像头组成,软件由python、二维码识别开源工具zbar和opencv组成。通过本文,可以学习如何正确快速安装zbar及快速上手zbar二维码识别,同时可采用opencv对二维码快速定位,实现二维码的快速扫描和解码。 阅读详情

相关推荐

树莓派+OpenCV+Arduino实现二维码与颜色识别检测及物料抓取总结

1. 系统总体设计和分析 系统总体分为硬件设计和软件设计,硬件设计就是基于树莓派2代B型和Arduino的硬件基础平台搭建,能够适应小型、灵活的现实需求,并为软件设计提供可观的计算能力承载和算法改进空间。软件设计就是在嵌入式Arduino上构建控制系统,用来控制物料车基本的移动,机器臂的抓取,摄像头的位置等操作,而在树莓派上构建软件开发环境,在OpenCV框架下,通过C++语言实现二维码的检测和...

. 2万+

指令集简介

SIMD(Single Instruction Multiple Data)是单指令多数据技术,目前Intel处理器支持的SIMD技术包括MMX,SSE,AVX。SSE(Stream SIMD Extentions,数据流单指令多数据扩展)是英特尔继MMX(Multi Media eXtension,多媒体扩展指令集)之后推出的新一代CPU指令集。MMX提供了8个64bit的寄存器进行SIMD操作,SSE系列提供了8个128bit的寄存器进行SIMD操作。

贾路飞的博客 2万+

二维码、条形码识别

zbar 主页:http://zbar.sourceforge.net/ ZBar是一个开源软件套件,用于从各种来源读取条形码,例如视频流,图像文件和原始强度传感器。 它支持许多流行的符号(条形码类型),包括EAN-13 / UPC-A,UPC-E,EAN-8,Code 128,Code 39,Interleaved 2 of 5和QR Code。 灵活的分层实现方便了任何应用程序的条形码扫描和...

sunmaize的博客 1854

SSE 指令集

这是一个typedef语句,它创建了一个新的数据类型别名__m128_u,它被定义为float类型。: 这是GCC(GNU Compiler Collection)的属性语法,用于为__m128_u类型添加一些属性。(16): 这个属性指定了该类型的大小为 16 字节(128位),这使得 __m128_u 可以在一个128位寄存器中存储。may_alias: 这个属性告诉编译器,指针类型可以别名为 __m128_u,这是因为这种类型的别名可能会导致一些类型别名的规则和内存别名的优化问题。

泠山的博客 2406

C++使用二维码识别库Zbar识别二维码图像

编译链接,链接到opencv和zbar的c++库。

m0_60352504的博客 2582

二维码识别与乱码解决:深入Zbar库应用

Zbar是一个开源的软件库,旨在简化条形码和二维码的识别过程。它通过提供一个通用的接口,允许开发者从各种类型的图像中提取条形码和二维码数据。Zbar的开发始于2004年,经过多年的迭代和社区贡献,它已经成为一个功能全面且性能稳定的二维码识别库。Zbar库具有以下特点:跨平台兼容性:Zbar支持多种操作系统,包括但不限于Linux、Windows、MacOS等。广泛的语言支持:提供了C、C++、Python等语言的接口,这使得Zbar易于集成到不同的应用中。高度优化。

weixin_42576804的博客 2269

SSE指令集学习之旅(一)

SSE指令集学习之旅(一)

qq_48034474的博客 4496

ZBar条形码和二维码扫描功能的实践指南

条形码和二维码是现代信息采集的基础技术,它们能够在极短的时间内存储和传输数据。条形码由一系列平行的黑白线条组成,而二维码则将数据编码在黑白的方格图案中,提供了更高的数据密度和容错能力。二者的工作原理都是通过特定的扫描设备或软件解读图形中的信息。ZBar提供了强大的API,使得扫描条形码和二维码变得轻而易举。我们将探讨如何通过ZBar的图像扫描接口进行调用以及如何解析数据。

weixin_42497762的博客 1252

SSE指令集学习

一、SSE简介 SSE指令,被包含在头文件:“emmintrin.h”(SSE2)中,且大多数SSE操作需要所给的数据是16-bytes对齐; SSE(Streaming SIMD Extensions),是一种SIMD(单指令,多数据)指令集,即利用一个指令同时对多个资料进行相同的动作.SSE指令主要包含了四个部分:单精度浮点数运算指令,整数运算指令,缓存控制指令和状态控制指令。 SSE指...

sinat_41612591的博客 7089

Zbar库跨平台条码二维码识别解决方案

Zbar是一个开源的软件库,它支持从图像数据中识别和解析多种类型的条码和二维码。它兼容多种操作系统,并且能够处理静态图像文件,或者直接从视频流中实时读取数据。Zbar的一个核心功能是其能够在多种图像格式中识别条码,包括常见的JPEG、PNG和BMP等格式。Autotools是一套广泛使用的GNU项目构建系统,它由一系列的工具组成,比如autoconf、automake、libtool等,能够帮助开发者创建跨平台的“configure”脚本,以适应不同系统的编译需求。

weixin_42571280的博客 1082

【S32K】S32K144入门笔记(4) Lin (Lin stack组件) 驱动超声波雷达实例

0. 引言 Lin这块是我一直没弄懂的部分。很多东西一知半解,当时感觉是硬凑了答案出来。 果然过标的时候出了问题,几个小伙伴帮忙一起刷夜也没搞定,好在标还是顺利过了,不然罪过大了。 之前做lin这块一直用的是linStack组件,这部分包含了协议栈部分,需要对lin的协议比较清楚和理解才好配置。 尤其是,图形界面配置完成后会生成一个ldf文件,这个文件很重要,所有的代码都是基于这个文件生成的,但是这个文件我确认没找到什么介绍资料,所以很多配置都是一点一点凑出来的,再实际验证的。 抓住这次写文档的机会,把当时

YoYo的桃子树 1万+

C/C++ 使用zbar库识别解析条形码与二维码(最全 附代码、踩坑及解决方案)

C/C++ 使用zbar库识别解析条形码与二维码(最全附代码、踩坑及解决方案);二维码识别解析常用主流库推荐有两个,一是Quirc,二是ZBar,两者都是C/C++库,跨平台一直方便,且速度较快。个人使用比较更推荐ZBar,运行识别速度比Quirc更快一点。

syk1748的博客 5801

Linux下Linpack测试GPU和CPU性能

前面的文章已经介绍了如何搭建Linpack环境:https://blog.youkuaiyun.com/liu_feng_zi_/article/details/107429720 接下来说明如何使用 一、编写运行脚本: 新建文件:run_linpack.sh,内容如下: export HPL_DIR =/root/LHC/Linpack/hpl-2.0_FERMI_v15 export MKL_NUM_THREADS=6 export OMP_NUM_THREADS=6 export MKL_DYNAMI.

liu_feng_zi_的专栏 4633

使用zbar库识别条形码与二维码

QR 码是一种高密度矩阵条码,Quirc是一个基于C/C++的一个二维码库 ,从图像中提取和解码QR 码。其部分功能还需依赖OpenCV库共同实现,比如quirc-demo-opencv(即图形的显示);inspect-opencv(测试)。1.足够快,可以用于实时视频:在现代x86内核上,从VGA帧提取和解码大约需要50毫秒。2.具有鲁棒且宽容的识别算法。可以正确识别和解码旋转和/或倾斜于相机的QR码。它还可以区分和解码同一图像中的多个代码。

m0_74259636的博客 7850

wincc 服务器授权型号,WinCC V7.5 SP1软件安装及授权方法

上篇教程给大家介绍了TIA Portal V16 安装方法,今天分享一下WinCC V7.5 SP1。目前V7.5 SP1是WinCC最新的版本,发布时间2019年11月13日。先放一个官网对WinCC V7.5 的介绍视频,感兴趣的可以先看一下。1、软件下载官网下载链接:https://support.industry.siemens.com/cs/document/109772879五个文件下...

weixin_39956110的博客 1万+

2024年捡垃圾指南:E5 V3/V4服务器CPU怎么选?从游戏多开到深度学习,附华南X99主板搭配清单

本文详细解析2024年E5 V3/V4服务器CPU的选购策略,涵盖游戏多开、深度学习等多种应用场景。通过对比E5 V3与V4系列的制程、功耗及性能差异,提供高性价比的CPU型号推荐及华南X99主板搭配方案,帮助用户在有限预算下打造高效能工作站。

weixin_42549451的博客 1573

Zbar与OpenCV实战:高效二维码识别开发指南

本文详细介绍了如何利用Zbar与OpenCV组合进行高效的二维码识别开发。通过对比分析,阐述了Zbar作为专业解码引擎在二维码识别中的高准确率与速度优势,并结合OpenCV强大的图像预处理能力,提供从环境搭建、基础识别到处理复杂场景(如定位裁剪)的完整实战指南,帮助开发者快速集成并优化识别流程。

vulkan6gpu的博客 902

(1)大蚂蚁即时通讯

即时通讯软件BigAnt(大蚂蚁)是杭州艾朴软件推出的一个”企业级”的即时通讯平台。该平台专为企业,其他企事业单位和政府单位而设计,目的就是为了增强内部沟通能力,提高内部员工的工作效率;同时服务器就直接置于单位内部,所有信息由单位自己管理,让单位以更安全、更可伸缩和更易于管理的方式灵活方便地使用协同和通信服务的功能! BigAnt(大蚂蚁)即时通讯软件包括服务器端和客户端。客户端功能包括单位

少安的砖厂 2233

QT+OpenCV+Zbar实现二维码识别

通过整合Qt、Zbar和OpenCV,我们实现了一个简单的二维码识别系统。OpenCV提供了图像处理和文件读取的支持,Zbar则负责解码二维码内容。这种组合方案为二维码识别提供了高效的实现途径,特别适合桌面应用和需要图像预处理的项目。t=O83A。

weixin_44765053的博客 2595

Android 10.0 kenel中修改rom系统内部存储的大小

在10.0的系统rom产品开发定制中,在对一些产品开发中的配置需求方面,由于在产品后续订单中,有些产品是出口的,但是硬件方面已经定板,时间比较仓促,所以 就需要软件方面在rom内部存储的大小方面作假,修改rom真实的大小容量,所以就需要在kenel驱动部分来修改这部分的值最好了,接下来分析下计算rom容量的 相关代码,然后做出修改

安卓兼职framework和app工程师的博客 1404

Open3D 从体素网格构建八叉树【2025最新版】

从体素网格构建八叉树,博客长期更新,本文最近更新时间为:2025年1月1日。

点云侠的博客 34万+

【Zbar+OpenCV3识别并二维码】C++详细实现教程

文章目录一、二维码简介1. 简介 一、二维码简介 1. 简介 二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response

Magician0619的博客 6266

太空安全卫士:基于YOLOv5的空间态势感知系统(实现轨道碰撞预警与太空环境保护)

做完这个项目,你会发现自己完整走过了“数据采集→标注→模型训练→功能集成→界面开发”的毕设全流程,这不仅是技术能力的证明,更是对“技术守护宇宙安全”这一理念的实践。答辩时,你可以重点讲这几点:系统解决了航天监测的哪些痛点、YOLOv5在太空目标检测中的性能优势、系统未来能怎么优化(比如对接航天监测网络、实现实时轨道预测)。未来,这个系统还能往“更智能”的方向发展:比如结合轨道计算预测碰撞风险、开发移动端APP让天文爱好者参与太空垃圾上报、在航天任务中实现全自动避障决策……想象空间很大。

m0_71589036的博客 90

Jetson Nano使用ZBar进行二维码检测和识读(C++)

前一篇博文中详细讲解了Jetson Nano的安装和使用,并且介绍了如何利用Opencv4中的二维码模块进行二维码检测和识读,详见:https://blog.youkuaiyun.com/qianbin3200896/article/details/103760640。 由于Opencv4中刚加入二维码模块内容,其检测效率和稳定性均不如另一个著名的开源库ZBar。ZBar是一个开源的条形码和二维码检测算法库...

你是怎么做到的?我为什么做不到 2764

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ROS高效进阶第四章 -- 机器视觉处理之ros集成zbar实现二维码检测

ROS高效进阶第四章 -- 机器视觉处理之ros集成zbar实现二维码检测

cy1641395022的博客 3491

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

快速上手ZBar库:免安装版,轻松实现二维码识别

快速上手ZBar库:免安装版,轻松实现二维码识别 【下载地址】ZBar库含64位库与32位库文件免安装版 ZBar库(含64位库与32位库文件)免安装版本仓库提供了一个免安装版的ZBar库资源文件,适用于64位和32位系统 项目地...

gitblog_09716的博客 909

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: STM32高级定时器实战:互补PWM输出与死区时间精确配置指南
下一篇: GD32 Embedded Builder:基于Eclipse的图形化IDE开发实战
lambda
博客等级 码龄23年 49粉丝 1303原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值