【转】谈谈使用VFW在windows下编程控制摄像头(一)。 【孙涛】

谈谈使用VFW在windows下编程控制摄像头(一)。 【孙涛】 <!--google_ad_client = "pub-8303851053100251";google_ad_width = 468;google_ad_height = 60;google_ad_format = "468x60_as";google_ad_type = "text_image";google_ad_channel ="";//--><script 阅读详情

原文:http://blog.youkuaiyun.com/suntaoznz/default.aspx?PageNumber=2

 

3.2使用视频捕获

3.2.1创建捕获窗体

 

下面的例子通过使用capCreateCaptureWindow函数来创建一个捕获窗体

 

hWndC = capCreateCaptureWindow (

 

    (LPSTR) "My Capture Window",       // 如果是Pop-up窗口的窗口名称 

 

    WS_CHILD | WS_VISIBLE,          // 窗口类型 

 

    0, 0, 160, 120,                      // 窗口位置和尺寸

 

    (HWND) hwndParent, 

 

    (int) nID /* child ID */); 

 

 

 

 

 

 

 

 

3.2.2连接到一个捕获驱动器

 

下面举例,如何通过捕获窗口的句柄hWndC连接到MS VIDEO驱动程序上,同时还演示了如何断开连接。使用capDriverDisconnect:

 

fOK = SendMessage (hWndC, WM_CAP_DRIVER_CONNECT, 0, 0L); 

 

// 或者使用宏连接: 

 

 

 

 

 

// fOK = capDriverConnect(hWndC, 0); 

 

 

 

 

 

 

 

 

 

 

 

// 关闭连接

 

capDriverDisconnect (hWndC); 

 

 

 

 

 

 

 

3.2.3列举安装的捕获驱动程序

 

使用capGetDriverDescription 函数来获得系统已经安装的所有捕获驱动程序的名称和版本。

 

char szDeviceName[80];

 

char szDeviceVersion[80];

 

for (wIndex = 0; wIndex < 10; wIndex++) 

 

{

 

    if (capGetDriverDescription (wIndex, szDeviceName, 

 

        sizeof (szDeviceName), szDeviceVersion, 

 

        sizeof (szDeviceVersion)) 

 

    {

 

        // 加入名字到一个已经安装的设备列表中

 

 

 

 

 

        // 让用户选择一个使用。

 

    }

 

} 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.2.4获得捕获驱动器的性能参数

 

       WM_CAP_DRIVER_GET_CAPS消息可以返回捕获驱动程序以及其硬件的性能参数。这些信息存放在一个CAPDRIVERCAPS的数据结构中。当你的应用程序的捕获窗口连接到一个新的捕获驱动器后,都会刷新这个CAPDRIVERCAPS数据结构。下面将使用capDriverGetCaps宏来获得捕获设备的性能参数。

 

CAPDRIVERCAPS CapDrvCaps; 

 

SendMessage (hWndC, WM_CAP_DRIVER_GET_CAPS, 

 

    sizeof (CAPDRIVERCAPS), (LONG) (LPVOID) &CapDrvCaps); 

 

// 或者,使用宏来获得驱动器的新能参数 

 

 

 

 

 

// capDriverGetCaps(hWndC, &CapDrvCaps, sizeof (CAPDRIVERCAPS)); 

 

 

 

 

 

 

 

 

 

 

 

3.2.5获得捕获窗口状态(Status)

 

下面例子使用SetWindowPos函数区设置捕获窗口的尺寸,这个尺寸的大小是基于输入的视频流大小的。输入视频流的尺寸大小由capGetStatus宏来获得,获得信息放在一个CAPSTATUS的数据结构体中。

 

 

 

 

 

 

 

CAPSTATUS CapStatus;

 

capGetStatus(hWndC, &CapStatus, sizeof (CAPSTATUS)); 

 

SetWindowPos(hWndC, NULL, 0, 0, CapStatus.uiImageWidth, 

 

             CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE); 

 

 

3.2.6显示对话框区设置视频属性

 

       每个捕获驱动器都可以提高3个以上的不同对话框来控制数字视频的特性和捕获处理。下面的例子示范如何显示这些对话框。在显示每个对话框前,该例会调用capDriverGetCaps宏并且检查返回的CAPDRIVERCAPS对象来查看是否可以能够显示特定的对话框。

 

 

 

 

 

 

 

CAPDRIVERCAPS CapDrvCaps; 

 

capDriverGetCaps(hWndC, &CapDrvCaps, sizeof (CAPDRIVERCAPS));  

 

// 视频源对话框 

 

 

 

 

 

if (CapDriverCaps.fHasDlgVideoSource)

 

    capDlgVideoSource(hWndC);  

 

// 视频格式对话框 

 

 

 

 

 

if (CapDriverCaps.fHasDlgVideoFormat) 

 

{

 

    capDlgVideoFormat(hWndC); 

 

    // 是否由新的图像尺寸?Are there new image dimensions?

 

 

 

 

 

    capGetStatus(hWndC, &CapStatus, sizeof (CAPSTATUS));

 

    // 如果有,发送通知给父窗口,告诉它尺寸改变了

 

 

 

 

 

}  

 

// 视频显示对话框 

 

 

 

 

 

if (CapDriverCaps.fHasDlgVideoDisplay)

 

    capDlgVideoDisplay(hWndC); 

 

 

 

 

 

 

 

3.2.7获得和设定视频格式

 

BITMAPINFO数据结构体可以实现长度可调节地去适应标准压缩的数据格式。因为它的长度可以变,所以在每次获得当前视频格式前,都必须去查询这个结构的长度以及分配的内存大小。该例子使用了capGetVideoFormatSize宏去获得缓存区大小,使用capGetVideoFormat宏区获得当前视频格式。 

 

 

 

 

 

 

 

LPBITMAPINFO lpbi;

 

DWORD dwSize;

 

 

 

 

 

 

 

dwSize = capGetVideoFormatSize(hWndC);

 

lpbi = GlobalAllocPtr (GHND, dwSize);

 

capGetVideoFormat(hWndC, lpbi, dwSize); 

 

 

 

 

 

 

 

// 访问视频格式,并且释放分配的内存。

 

 

 

 

 

 

 

 

 

 

 

应用程序使用capSetVideoFormat宏(WM_CAP_SET_VIDEOFORMAT),把一个BITMAPINFO结构发送给捕获窗口,显示修改。因为视频格式由设备指定的,你的应用程序可以去检查获得的返回值,来知道这个视频格式是不是公开的。

 

 

 

 

 

 

 

3.2.8预览视频

       下面使用capPreviewRate宏来设置预览模式的帧频率为66毫秒/帧,使用capPreview宏在捕获窗口预览图像。

 

 

 

 

 

 

 

capPreviewRate(hWndC, 66);      // 速度,微秒

 

 

 

 

 

capPreview(hWndC, TRUE);       // 开始预览 

 

 

 

 

 

 

 

 

 

 

 

capPreview(hWnd, FALSE);        // 屏蔽预览 

 

 

 

 

 

 

 

3.2.9允许视频覆盖(Overlay)

 

下面使用capDriverGetCaps宏去检测这个捕获驱动是否支持覆盖(Overlay)模式,如果支持,就允许视频覆盖模式;

 

 

 

 

 

 

 

CAPDRIVERCAPS CapDrvCaps; 

 

capDriverGetCaps(hWndC, &CapDrvCaps, sizeof (CAPDRIVERCAPS)); 

 

if (CapDrvCaps.fHasOverlay) 

 

    capOverlay(hWndC, TRUE);

 

 

 

 

 

 

 

 

 

3.2.10捕获文件命名

 

    下例使用capFileSetCaptureFile宏来指定一个要命名的文件名(mycap.avi),使用capFileAlloc宏去预分配5MB的文件。

 

 

 

 

 

 

 

char szCaptureFile[] = "MYCAP.AVI";

 

capFileSetCaptureFile( hWndC, szCaptureFile); 

 

capFileAlloc( hWndC, (1024L * 1024L * 5)); 

 

 

 

3.2.11格式化音频捕获

 

下例使用capSetAudioFormat来设置音频格式为11-KHz PCM 8-bit,立体声。

 

 

 

 

 

 

 

WAVEFORMATEX wfex;

 

wfex.wFormatTag = WAVE_FORMAT_PCM;

 

wfex.nChannels = 2;                     // 使用立体声

 

wfex.nSamplesPerSec = 11025;

 

wfex.nAvgBytesPerSec = 22050;

 

wfex.nBlockAlign = 2;

 

wfex.wBitsPerSample = 8;

 

wfex.cbSize = 0;

 

capSetAudioFormat(hWndC, &wfex, sizeof(WAVEFORMATEX)); 

 

 

 

 

 

 

 

3.2.12改变视频捕获设置

 

       下例使用capCaptureGetSetup和capCaptureSetSetup宏来改变捕获速度,从默认值(15帧/秒)到10帧/秒。

 

 

 

 

 

 

 

CAPTUREPARMS CaptureParms;

 

float FramesPerSec = 10.0;

 

capCaptureGetSetup(hWndC, &CaptureParms, sizeof(CAPTUREPARMS));

 

CaptureParms.dwRequestMicroSecPerFrame = (DWORD) (1.0e6 / 

 

    FramesPerSec);

 

capCaptureSetSetup(hWndC, &CaptureParms, sizeof (CAPTUREPARMS)); 

 

 

 

 

 

 

 

3.2.13捕获数据

 

       下例使用capCaptureSequence宏开始视频捕获,使用capFileSaveAs宏从捕获文件拷贝数据到其他文件NEWFILE.AVI中。

 

 

 

 

 

 

 

char szNewName[] = "NEWFILE.AVI";

 

// Set up the capture operation.

 

capCaptureSequence(hWndC); 

 

// Capture.

 

capFileSaveAs(hWndC, szNewName); 

 

 

 

 

 

 

 

3.2.14加入信息块

 

如果你想添加其他信息(除了音视频),你可以建一个信息块并把它们插入到一个捕获文件中去。信息块可以包含这个方面的内容。比如版权信息,视频源的ID,外部显示的时间信息。下面的例子保存外部时间信息SMPTE()到一个信息块中,并加入使用capFileSetInfoChunk宏加入到捕获文件中。

 

 

 

 

 

 

 

//  This example assumes the application controls 

 

 

 

 

 

//  the video source for preroll and postroll. 

 

CAPINFOCHUNK cic;

 

// . 

 

// . 

 

// . 

 

cic.fccInfoID = infotypeSMPTE_TIME;

 

cic.lpData = "00:20:30:12"; 

 

cic.cbData = strlen (cic.lpData) + 1;

 

capFileSetInfoChunk (hwndC, &cic); 

 

 

 

 

 

 

 

3.2.15在程序中加入回调函数

应用程序可以注册捕获窗口的回调函数,这样就可以把下面的情况通知给应用程序:

 

l         状态变化了 

 

l         错误发生了 

 

l         视频和音频的缓冲区的数据可以使用了 

 

l         在捕获期间,应用程序将yield 

 

下面的例子将创建一个捕获窗口并在应用的消息循环中,注状态、错误、视频流、帧的回调函数。

 

 

 

 

 

 

 

case WM_CREATE: 

 

{ 

 

    char    achDeviceName[80] ; 

 

    char    achDeviceVersion[100] ; 

 

    char    achBuffer[100] ; 

 

    WORD    wDriverCount = 0 ; 

 

    WORD    wIndex ; 

 

    WORD    wError ; 

 

    HMENU   hMenu ; 

 

 

 

    // 使用capCreateCaptureWindow宏创建一个捕获窗体.

 

 

 

 

 

    ghWndCap = capCreateCaptureWindow((LPSTR)"Capture Window", 

 

        WS_CHILD | WS_VISIBLE, 0, 0, 160, 120, (HWND) hWnd, (int) 0); 

 

 

 

    // 使用capSetCallbackOnError宏注册错误回调函数 

 

 

 

 

 

     capSetCallbackOnError(ghWndCap, fpErrorCallback); 

 

 

 

    // 使用capSetCallbackOnStatus宏注册状态回调函数 

 

 

 

 

 

    capSetCallbackOnStatus(ghWndCap, fpStatusCallback); 

 

 

 

    //使用capSetCallbackOnVideoStream宏注册视频流回调函数

 

    capSetCallbackOnVideoStream(ghWndCap, fpVideoCallback); 

 

 

 

    //使用capSetCallbackOnFrame宏注册帧回调函数

 

    capSetCallbackOnFrame(ghWndCap, fpFrameCallback); 

 

 

 

    // 连接到一个捕获驱动器上 

 

 

 

 

 

 

 

 

 

 

 

    break; 

 

} 

 

case WM_CLOSE: 

 

{ 

 

//使用capSetCallbackOnFrame宏关闭帧回调函数 

 

// 类似可调用其他存在的回调函数。

 

 

 

 

 

 

 

 

 

 

 

    capSetCallbackOnFrame(hWndC, NULL); 

 

  break; 

 

} 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.2.16创建一个状态回调函数

 

下面的例子是一个简单的状态回调函数,使用capSetCallbackOnStatus宏来注册这个回调函数。

 

// StatusCallbackProc: 状态回调函数 

 

 

 

 

 

// hWnd:            捕获窗体句柄 

 

 

 

 

 

// nID:              当前状态的状态码 

 

 

 

 

 

// lpStatusText:       当前状态的文本字符 

 

// 

 

LRESULT PASCAL StatusCallbackProc(HWND hWnd, int nID, 

 

    LPSTR lpStatusText) 

 

{ 

 

    if (!ghWndMain) 

 

        return FALSE; 

 

 

 

    if (nID == 0) {           // 清除旧的状态信息 

 

        SetWindowText(ghWndMain, (LPSTR) gachAppName); 

 

        return (LRESULT) TRUE; 

 

    } 

 

    // 显示状态ID和状态文本.. 

 

 

 

 

 

    wsprintf(gachBuffer, "Status# %d: %s", nID, lpStatusText); 

 

 

 

    SetWindowText(ghWndMain, (LPSTR)gachBuffer); 

 

    return (LRESULT) TRUE; 

 

} 

 

 

 

3.2.17创建一个错误的回调函数

 

下面例子是一个简单的错误回调函数。通过capSetCallbackOnError宏来注册回调。

 

// ErrorCallbackProc:    错误回调函数 

 

 

 

 

 

// hWnd:              捕获窗口句柄 

 

 

 

 

 

// nErrID:              错误代码 

 

 

 

 

 

// lpErrorText:          关于错误的文本信息 

 

// 

 

LRESULT PASCAL ErrorCallbackProc(HWND hWnd, int nErrID,

 

    LPSTR lpErrorText) 

 

{ 

 

 

 

    if (!ghWndMain) 

 

        return FALSE; 

 

 

 

    if (nErrID == 0)            // Starting a new major function. 

 

        return TRUE;          // 清除旧的错误 

 

 

 

    // 显示错误ID和错误文本信息 

 

 

 

 

 

    wsprintf(gachBuffer, "Error# %d", nErrID); 

 

 

 

    MessageBox(hWnd, lpErrorText, gachBuffer, 

 

               MB_OK | MB_ICONEXCLAMATION); 

 

 

 

    return (LRESULT) TRUE; 

 

} 

 

 

 

 

 

 

 

3.2.18创建一个帧回调函数

 

下面是一个简单的帧回调函数。通过capSetCallbackFrame宏来注册回调函数。 

 

 

 

 

 

 

 

// FrameCallbackProc:   帧回调函数 

 

 

 

 

 

// hWnd:              捕获窗体句柄 

 

 

 

 

 

// lpVHdr:             指向一个包含帧信息的数据结构体 

 

// 

 

LRESULT PASCAL FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr) 

 

{ 

 

    if (!ghWndMain) 

 

        return FALSE; 

 

 

 

    wsprintf(gachBuffer, "Preview frame# %ld ", gdwFrameNum++); 

 

    SetWindowText(ghWndMain, (LPSTR)gachBuffer); 

 

    return (LRESULT) TRUE ; 

 

} 

 

 

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/suntaoznz/archive/2005/08/08/448303.aspx

谈谈使用VFW在windows下编程控制摄像头(二)。 【孙涛】 如要转贴请注明转至blog.youkuaiyun.com/suntaoznz。谢谢!3.2使用视频捕获3.2.1创建捕获窗体下面的例子通过使用capCreateCaptureWindow函数来创建一个捕获窗体hWndC = capCreateCaptureWindow (    (LPSTR) "My Capture Window",       // 如果是Pop-up窗口的窗口名称     WS_CHIL 阅读详情

相关推荐

VFW(在WIN7下会黑屏共享后希望能有大拿帮忙解决一下)

这段代码存在在WIN7下运行是有黑屏问题,希望能帮忙解决,共同学习。

[转]视频捕捉全教程(vc+vfw)

目 录一. 视频捕获快速入门 二.基本的捕获设置           1.设置捕获速度:           2.设置终止捕获           3.捕获的时间限制 三.关于捕获窗口           1.创建一个AVICAP捕获窗口           2.将一个捕获窗口连接至捕获设备           3. 父窗口与子窗口的交互           4.捕获窗口的状态 四.视频捕获驱动和

call4216的专栏 2939

视频捕获软件

汉化并添加了一些控制功能,可用在小型的视频会议,监控上。学习用。

视频捕获

视频数据的实时采集,主要通过AVICAP模块中的消息、宏函数、结构以及回调函数来完成。视频捕获的一般过程如下:2.1 建立捕获窗口利用AVICAP 组件函数 capCreateCaptureWindow() 建立视频捕获窗口,它是所有捕获工作及设置的基础,其主要功能包括:① 动态地同视频和音频输入器连接或断开;② 设置视频捕获速率;③ 提供视频源、视频格式以及是否采用视频压缩的对话框;④

wskdnnt的专栏 745

Video for windows(VFW)

Video for windows(VFW)

Win7下VFW调用

Win7下VFW的使用. 文章地址: http://blog.youkuaiyun.com/bagboy_taobao_com/article/details/45270691

猫抓浏览器资源嗅探:5分钟捕获网页视频,搞定 M3U8 视频下载

你想把一段课程视频存到本地,右键菜单里却只有"播放",找不到"下载"按钮。这时候需要的是浏览器资源嗅探扩展:猫抓(cat-catch)会把页面加载过的媒体自动捕获并列出,帮你预览、一键下载。这份教程带你 5 分钟完成第一次资源捕获。 ## 它是干什么的 猫抓像网页上的"流量记账员",页面加载了什么媒体,它就记什么,需要时把清单交给你。重点看这几条: - **全类型嗅探**:视频、音频、图片,

gitblog_01163的博客 183

Android音频学习(一)——音频基础

在系统的学习Android音频之前,先了解音频的基础知识。

miemie2014的博客 1483

Delphi 控制摄像头操作

DELPHI控制摄像头操作可以使用TVideoCap控件,或直接使用MS的AVICAP32.DLL就可轻松的实现对摄像头编程。 首先常量定义和函数定义: implementationconst WM_CAP_START = WM_USER;const WM_CAP_STOP = WM_CAP_START + 68;const WM_CAP_DRIVER_CONNECT = WM_CAP_STA...

weixin_33970449的博客 931

JSP期末考试复习习题及答案

以下习题是对于平时课堂小测的整理,如有错误敬请指正! 欢迎一起交流~ 预祝各位小伙伴们考试顺利! Test1 一. 单选题 – 1.(单选题)当用户请求jsp页面时,JSP引擎就会执行该页面的字节码文件响应客户的请求,执行字节码文件的结果是() A. 发送一个JSP源文件到客户端 B. 发送一个Java文件到客户端 C. 发送一个HTML页面到客户端 D. 什么都不做 – 2.(单选题)下列动态网页和静态网页的根本区别描述错误的是( D) A. 静态网页服务器端返回的HTML文件是事先存储好的 B. 动.

技术小白 2万+

MaxEnt物种分布预测中的常见误区与优化技巧:如何提高模型准确率

本文深入探讨了MaxEnt物种分布预测模型从基础应用到精准预测的进阶实践。针对模型准确率提升,文章系统分析了环境变量筛选、模型参数调优、结果批判性解读等核心环节的常见误区,并提供了基于生态位模型原理的深度优化技巧,帮助研究者产出更可靠、可解释的预测结果。

weixin_29219539的博客 594

VFW.h宏解析 (视频开发必备) ----------纠结了2天憋出来的东西

VFW.h宏解析 (详细的参考VFW.H)                                                   作者:岳东卫   转载请写明转载出处......                                          VFW库是微软推出的支持视频处理的一组库,我们利用VFW可以开发出各种各样的视频处理程序 。 开发实时语音视频系统

Programmer小卫 8661

【LCMM实战指南】从增长混合模型到潜在类别轨迹分析的纵向数据建模

本文深入解析了LCMM(潜在类别混合模型)在纵向数据建模中的应用,对比了LCGA与GMM的核心差异与选择策略。通过R语言lcmm包的实战演练,详细展示了从数据模拟、模型拟合、类别数选择到结果解读的全流程,为识别数据中不同的发展轨迹亚型提供了系统指南。

weixin_29070861的博客 379

谈谈使用VFW在windows下编程控制摄像头(一)。

<br />  <br />这段时间闲来无事,看了看MSDN的文档,自己翻译了一下。一是为了学习,二是对空闲时间的打发。所以也希望大家在拍砖的同时,尊重我的劳动,如要转贴请注明转至blog.youkuaiyun.com/suntaoznz。谢谢!<br />                                                                                                                 孙涛 2005-8-6<br />Mi

langbing2009的专栏 740

【100分】最长子字符串的长度

题目要求在一个环形字符串中找出字符 ‘o’ 出现了偶数次的最长子字符串长度。这里的字符串是一个环形的,即首尾相连。代码统计了字符串中字符 ‘o’ 的出现次数,并根据其奇偶性返回相应的最长子字符串长度。当 ‘o’ 的数量为偶数时,直接返回字符串长度;当 ‘o’ 的数量为奇数时,返回长度减去 1。给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出 ‘o’ 字符出现了偶数次最长子字符串的长度。【最长子字符串的长度】

weixin_54707168的博客 895

【txt文本加密】使用 cryptography 库实现加密和解密

cryptography 库是一个强大的 Python 库,用于实现加密和解密功能。它提供了各种加密算法,包括对称加密、非对称加密、哈希函数等。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2666

PLSQL Developer安装详细步骤

一、下载安装PLSQL Developer(plsql安装百度也有步骤) 官网下载地址:https://www.allroundautomations.com/registered-plsqldev/ 1、网上自己下载适合自己电脑的安装包(32或64),并解压。 2、打开解压的文件夹,得到以下三个文件(分别是汉化工具,PLSQL安装包、激活码),双击安装,如下图: 3、安装界面,点击next,进入下一步,如图: 4、安装协议界面,此处必须选择“I accept the terms in

Gorden的博客 11万+

windows下编程控制摄像头的详细介绍

这段时间闲来无事,看了看MSDN的文档,自己翻译了一下。一是为了学习,二是对空闲时间的打发。所以也希望大家在拍砖的同时,尊重我的劳动,如要转贴请注明转至blog.youkuaiyun.com/suntaoznz。谢谢!

潘无穷 2636

【Realtek sdk-3.4.14b】RTL8197FH+RTL8363NB当WAN/LAN IP冲突的时候,再次切换回正常的WAN,出现电脑无法上网也无法ping通设备网关问题分析及解决方案

如上图所示,当WAN和LAN网段冲突的时候,会导致路由设备异常,无法上网,但是修改为不冲突的网段之后,依然无法上网,同时下级PC也无法ping通路由设备,正常的如下图所示如上图所示,正常网络拓扑是可以正常的,但是在上级和路由LAN冲突的时候,再次切换为正常的网络也是异常问题复现步骤1.路由设备WAN口接到一个和本级路由是相同网段的设备2.拔掉WAN口,将WAN口接到一个和本级路由是不同网段的设备3.此时PC无法访问路由器。

wgl307293845的博客 665

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 【转】谈谈使用VFW在windows下编程控制摄像头(一)。 【孙涛】
下一篇: 【转】H.264开源解码器评测
code09
博客等级 码龄18年 31粉丝 56原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值