电脑屏幕捕获编码设计案例

Windows 2D 绘图 (GDI, GDI+, Direct2D) Windows 2D 绘图GDIGDI 函数GDI+GDI 和 GDI+ 的区别GDI+ 新特性Direct2D视觉效果demo GDI GDI 是 Graphics Device Interface 的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有 Windows 程序的图形输出。 在 Windows 操作系统下,绝大多数具备图形界面的应用程序都离不开 GDI... 阅读详情
 

介绍:

       常常我们想要编程捕获整个屏幕的内容,下面将解释如何做到这一点。典型的,我们的选择是使用GDI或者DirectX。另外一个值得考虑的方法是Windows Media API,直接将捕获的屏幕图像编码成码流输出,不过本文中不讨论该方法,主要讨论前两种技术。每一种方法中,我们得到了屏幕快照后,就可以用于保存或者编码输出。下面讨论了两种方法,并给出程序的部分代码和运行截图。

 

用GDI方法捕获

       如果性能不是问题,并且我们需要的只是屏幕快照,就可以考虑采用GDI方法。这种方法基于桌面也是一个窗口的基本思想(桌面也有窗口句柄和设备上下文),只要得到被捕获桌面的上下文,就可以用普通的方法把内容blit到我们应用定义的上下文中。如果知道桌面句柄(可以用函数GetDesktopWindow()函数得到),得到上下文是很直接的。步骤如下:

1)  使用GetDesktopWindow获得桌面句柄

2)  使用函数GetDC获得桌面窗口的DC

3)  为桌面DC创建一个兼容的DC和一个用于选入兼容DC的兼容位图。可以用函数CreateCompatibleDC和CreateCompatibleBitmap;可以用SelectObject将位图选入我们的DC

4)  不管何时准备捕获屏幕,blit桌面DC内容到创建的兼容的DC,我们创建的兼容位图现在包含了捕获时刻的屏幕内容

5)  当完成捕获后,不要忘记释放对象

例子:

Void CaptureScreen()
{
    int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
    int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
    HWND hDesktopWnd = GetDesktopWindow();
    HDC hDesktopDC = GetDC(hDesktopWnd);
    HDC hCaptureDC = CreateCompatibleDC(hDesktopDC);
    HBITMAP hCaptureBitmap =CreateCompatibleBitmap(hDesktopDC, 
                            nScreenWidth, nScreenHeight);
    SelectObject(hCaptureDC,hCaptureBitmap); 
    BitBlt(hCaptureDC,0,0,nScreenWidth,nScreenHeight,
           hDesktopDC,0,0,SRCCOPY|CAPTUREBLT); 
    SaveCapturedBitmap(hCaptureBitmap); //占位符号,可以在此处放入自己的代码
    ReleaseDC(hDesktopWnd,hDesktopDC);
    DeleteDC(hCaptureDC);
    DeleteObject(hCaptureBitmap);
}

上面的例子中,函数GetSystemMetrics()如果使用SM_CXSCREEN则返回屏幕宽,如果使用SM_CYSCREEN则返回屏幕的高。参考相关代码细节,我们很容易创建文件或者影片。

 

采用DirectX的方法:

    由于DirectX提供了一个干净的方法,所以捕获屏幕快照在DirectX下非常容易。

每一个DirectX应用都包含了我们称为buffer或者surface的包含了相应于应用的视频内存,被称为后备缓冲。一些程序可能有超过一个后备缓冲。另外有一个所有程序能够存取的前端缓冲,该前端缓冲包含了桌面内容相关的视频内存,所以就是屏幕图像。

 

通过存取我们应用程序的前端缓冲,我们就可以捕获此刻的屏幕内容。存取应用的前端缓冲是简单直接的。接口IDirect3DDevice9提供了GetFrontBufferData()方法,带一个IDirect3DSurface9对象指针,拷贝前端缓冲的数据进入surface. IDirect3DSurfce9对象能够通过方法IDirect3DDevice8::CreateOffscreenPlainSurface()获得。一旦屏幕被捕获到surface,我们可以使用D3DXSaveSurfaceToFile()以位图方式保存表面到磁盘。捕获代码如下:

extern IDirect3DDevice9* g_pd3dDevice;
Void CaptureScreen()
{
    IDirect3DSurface9* pSurface;
    g_pd3dDevice->CreateOffscreenPlainSurface(ScreenWidth, ScreenHeight,
        D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL);
    g_pd3dDevice->GetFrontBufferData(0, pSurface);
    D3DXSaveSurfaceToFile("Desktop.bmp",D3DXIFF_BMP,pSurface,NULL,NULL);
    pSurface->Release(); 
}

上面代码中的g_pd3dDevice是一个IDirect3DDevice9对象,假定已经正确的初始化了。代码片断直接保存捕获图像到磁盘。然而,代替保存到磁盘,我们可能想要直接操作这个位图。我们可以通过使用方法IDirect3DSurface9::LockRect()来做到这点,获得一个指向表面的指针。我们可以拷贝图像到应用内存然后操作他们。接下来的代码片断表明了如何拷贝表面到我们的应用内存:

extern void* pBits;
extern IDirect3DDevice9* g_pd3dDevice;
IDirect3DSurface9* pSurface;
g_pd3dDevice->CreateOffscreenPlainSurface(ScreenWidth, ScreenHeight,
                                          D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, 
                                          &pSurface, NULL);
g_pd3dDevice->GetFrontBufferData(0, pSurface);
D3DLOCKED_RECT lockedRect;
pSurface->LockRect(&lockedRect,NULL,
                   D3DLOCK_NO_DIRTY_UPDATE|
                   D3DLOCK_NOSYSLOCK|D3DLOCK_READONLY)));
for( int i=0 ; i < ScreenHeight ; i++)
{
    memcpy( (BYTE*) pBits + i * ScreenWidth * BITSPERPIXEL / 8 , 
        (BYTE*) lockedRect.pBits + i* lockedRect.Pitch , 
        ScreenWidth * BITSPERPIXEL / 8);
}
g_pSurface->UnlockRect();
pSurface->Release();

 

上面的pBits是一个void *,在拷贝之前要确认我们已经分配了足够的内存。一个BITSPERPIXEL的典型值是32位,然后,依赖于你的显示器设置。重要的是注意到表面的宽度与捕获屏幕的宽度并不相同,由于这个问题涉及到内存对齐,表面可能加入附加的部分到每行的结束来对齐到字边界。lockedRect.Pitch给出两个行之间的字节数目,也就是说,为了前进到下一行正确的点,我们应当推进Pitch,而不是Width.下面的代码反向的拷贝表面的字节:

for( int i=0 ; i < ScreenHeight ; i++)
{
    memcpy((BYTE*) pBits +( ScreenHeight - i - 1) * 
        ScreenWidth * BITSPERPIXEL/8 , 
        (BYTE*) lockedRect.pBits + i* lockedRect.Pitch , 
        ScreenWidth* BITSPERPIXEL/8);
}

 

这点代码用于转换自顶而下和自底而上的位图。

上面的技术中LockRect是IDirect3DSurface9中存取捕获图像的一个方法,我们还有另外一个更加复杂的方法,GetDC方法。IDirect3DSurface9::GetDC()方法用来获得GDI兼容的设备上下文,这样就可以直接blit表面内容到我们应用定义的DC。

 

然而,GetFrontBufferData是一个慢的方法,不应当用于性能临界的应用,GDI方法是更快的方法。

 

捕获程序要点:

    程序初始化的时候需要初始化相关资源,在WM_CREATE消息中初始化D3D,然后初始化FFMPEG,同时启动定时器;当用户选择开始捕获的时候,每次定时器到,处理WM_TIMER消息,锁定前端缓冲平面,然后拷贝数据到缓冲区,将该缓冲区传递给FFMPEG编码并输出;当用户停止的时候,停止定时器,清理D3D和FFMPEG,然后退出。下面是几个需要注意的技术点:

1)屏幕的颜色深度,由于屏幕可能处于不同的颜色深度下,所以需要仔细区分,当GetDeviceCaps函数返回颜色深度为16的时候,需要区分是否RGB555或者RGB565,根据颜色深度来设定传递给FFMPEG的像素格式。

2)编码参数的设定,由于编码库支持的图像大小不是任意的,所以需要仔细的设置编码参数,否则不能初始化编码器。

3)图像转换的设定,由于原图像和目的图像的色彩空间和大小都不一样,所以需要仔细考虑图像转换,色彩空间的转换可以用img_convert,大小的转换可以用img_resample,注意到大小转换只针对YUV420P,所以在本案例中是先转换色彩空间,从RGBA32转换到YUV420P,然后调用重采样函数改变大小。

4)编码图像的保存,调用avcodec_encode_video编码图像,然后直接写入文件即可,如果想要从网络输出,那么考虑rtp_callback函数回调,由库来做合适的分包,然后加上合适的头部发送

5)抓屏过程中,程序需要转换成托盘图标。保存为bmp的时候图像行是颠倒的,要把表面的第一行作为bmp的最后一样。传给解码器的是正常坐标

 

程序运行截图:

该图是采用的捕获工具所截获的H263纯码流通过VLC播放然后用快照功能获得,是CIF的分辨率。

一些可能的改进:

1.针对DirectX和OpenGL的窗口捕获,这个需要采用hook技术,比较麻烦

2.针对不同图像尺寸的编码,目前的库不能支持XGA的H263编码,4cif的编码出现了不规则捕获的问题,问题还没有查清楚,也许是能力问题,也许是程序设计问题。

3.编程中的一些优化和保护措施没有做好,程序运行的时候占用的CPU资源比较大

开源工具screenpipe:高性能屏幕捕获与低延迟流媒体传输实战 屏幕捕获与流媒体传输是实时音视频技术中的基础环节,其核心原理是通过高效的图像采集、编码压缩和网络传输,将本地画面实时推送到远端。这项技术的价值在于能够实现低延迟、高质量的远程桌面共享、在线教育、游戏直播和视频会议等应用。开源工具screenpipe正是基于模块化管道设计思想,将捕获、编码、输出环节解耦,通过灵活组合软硬件编码器(如libx264、NVENC)和优化内存零拷贝机制,在资源消耗与延迟控制上展现出显著优势。本文以screenpipe为例,深入解析其如何通过配置驱动和性能调优,为开发者和工程师提供一 阅读详情

相关推荐

OBS录屏进阶:精准捕获目标窗口与自定义画质优化

本文深入探讨了OBS录屏的进阶技巧,重点讲解如何从基础的“显示器捕获”转向精准的“窗口捕获”,以解决录制编程教学、软件演示时画面不纯的问题。文章详细分析了窗口捕获的原理、解决黑屏等兼容性问题的实战方法,并指导用户根据需求自定义分辨率、帧率与码率,实现画质与文件大小的最佳平衡,助力创作更专业、高效的视频内容。

weixin_29313547的博客 326

若干种窗口画面的捕获方法

在直播项目中 需要捕获某个窗口的画面并共享 总结了如下几种场景中窗口的捕获方法 1、dc拷贝(BitBlt、PrintWindow) 这是最基本的方法 直接拿到窗口dc 然后从dc中拷贝窗口画面 可优先使用PrintWindow 因为该API可以捕获窗口超出桌面范围的区域。需要注意的是,PrintWindow会触发目标窗口执行WM_PAINT,并且执行完毕后才会返回,所以可能造成目标窗口频繁刷新,或调用PrintWindow会耗时,所以不推荐使用这个API。 关键词:GetDC BitBlt..

翻肚鱼儿的博客 3579

VC++屏幕捕获并保存成图片(附源码)

捕获屏幕图像,并保存到图片文件中!

dvlinker的技术专栏 3139

Windows上屏幕捕捉功能的三大API层级 GDI

层级API/技术核心原理优点缺点典型应用层级一 (传统)GDIBitBltCPU像素复制兼容性好、简单性能差、无法捕捉硬件加速内容老旧VNC, inletex, 简单截图工具层级二 (现代)GPU纹理复制性能极高、效率高复杂、仅限Win8+TeamViewer, AnyDesk, Parsec, OBS(旧)层级三 (最新)GPU复制 + 安全封装安全、易用、窗口捕捉能力强需用户授权、仅限新版Win10+Teams, Discord, OBS(新), Windows录屏。

kanhao100的博客 4291

DXGI桌面采集流程简易实现指南

DirectX Graphics Infrastructure(DXGI)是微软DirectX技术的一个组件,它为图形硬件抽象层提供了一套统一的接口。DXGI旨在提高图形应用程序与不同硬件设备间的兼容性,简化驱动模型,并提升性能和稳定性。DXGI的结构由几个关键组件构成,包括:工厂(Factory):这是DXGI组件的入口点,负责创建交换链和其他DXGI对象。工厂通常在程序初始化时创建,并且与特定的适配器(硬件或软件)关联。适配器(Adapter)

weixin_36064575的博客 1171

DirectX与GDI在图形编程中的应用对比与优化

在这一实践案例中,我们可以总结出几点经验:技术选择:根据不同的需求和场景选择合适的技术,可以大幅提升应用性能。细节打磨:在混合使用不同技术时,注重细节的处理是关键,如坐标转换和渲染同步。持续优化:性能优化是一个持续的过程,需要根据反馈不断调整资源管理和渲染策略。通过本案例的分析,我们可以看到,DirectX与GDI的混合使用确实能够带来性能和视觉效果的双重优势,但这也要求开发者具有较高的技术深度和广泛的知识面。

weixin_33308579的博客 543

Windows通过DXGI进行屏幕捕获(代码解析及源码配套)

windows C++ 使用DXGI屏幕捕获功能

2403_83063732的博客 4330

远程电脑屏幕监控系统设计与实现

远程屏幕监控技术通过实时捕获目标设备的显示画面,并经编码压缩后通过网络传输至客户端进行解码与渲染,实现跨地域的可视化操作与管理。其核心流程包括屏幕采集、图像编码、数据传输与终端显示四大环节,广泛应用于IT运维、远程协助与安全审计等场景。主流协议如RDP、VNC和TeamViewer在性能与兼容性上各有侧重:RDP依托Windows系统优化,具备高效图形处理能力;VNC基于帧缓冲复制,支持多平台但带宽占用较高;TeamViewer则集成NAT穿透与加密机制,适用于复杂网络环境下的即连即用。

weixin_42513209的博客 1019

Python电脑屏幕&摄像头录制软件(提供源代码)

Python电脑屏幕&摄像头录制软件(提供源代码)

修行之路 637

电脑屏幕录制工具全功能实战指南

屏幕录制技术依托操作系统图形子系统实时捕获像素数据,结合音视频编码器进行同步压缩处理。其核心流程包括:帧捕获→图像预处理→编码封装→存储或流式传输,涉及多线程调度、GPU加速与I/O优化等关键技术。在在线教育中,教师通过区域录制聚焦课件内容;开发者利用全屏录制调试UI动画性能;游戏主播则依赖高帧率+低延迟架构保证直播流畅性。不同场景对分辨率(1080p/4K)、帧率(30/60fps)及码率(10~50Mbps)提出差异化需求,驱动录制工具向可配置化、低侵入性、跨平台统一方向演进。

weixin_36064575的博客 1246

电脑屏幕截屏捕捉工具

此工具可用于电脑使用过程中的,屏幕捕捉、录像、取色、标尺、划线、转换、合并图集等操作,非常方便好用,特此分享

利用OBS推流抖音直播电脑屏幕或PC游戏

抖音目前的火爆程度相信大家都有目共睹,抖音也为部分活跃用户提供直播功能,开通直播的方法有:①抖音粉丝达到10000粉丝,官方会自动邀请你开通直播权限。②加入和抖音官方合作的工会,无需粉丝,也可以开通直播权限。开通直播功能后,打开抖音直接可以用摄像头直播,如果需要直播电脑画面或者电脑游戏就要用到OBS这款软件,下面介绍利用OBS推流软件在抖音里直播电脑屏幕或PC游戏。开放式广播软件是免费开源软件,用于视频录制和直播。支持的功能包括:编码使用H264(X264)和AAC。支持 英特尔快速同步视频(QSV)和NV

仿站、源码搭建/迁移技术博客 4万+

Go语言AI智能体开发实战:基于LangGraphGo构建下一代工作流引擎

在AI应用开发领域,工作流编排是构建复杂智能系统的核心技术。其核心原理是将任务执行过程建模为状态图,通过节点和边的组合定义数据流转路径,实现多步骤推理与工具调用的自动化。这种基于状态图的编程模型,为智能体提供了清晰的“思考-行动-观察”循环抽象,显著提升了复杂业务逻辑的可维护性和可观测性。从技术价值看,它解决了传统代码中状态分散、流程僵化的问题,支持条件分支、并行执行等高级模式,是实现生产级AI应用的关键基础设施。在应用场景上,该技术广泛适用于客服机器人、自动化审批、数据ETL等需要多步骤协调的领域。本文以

weixin_30457551的博客 360

【实时屏幕捕获项目】

本文介绍了一个基于Python Flask框架的实时屏幕捕获系统,该系统通过PyAutoGUI捕获屏幕内容,使用OpenCV进行图像处理,并将视频流实时传输到网页端。系统具有自动资源管理功能,30秒无访问会自动停止流以节省资源。技术实现包括:使用Flask创建Web服务,PyAutoGUI进行屏幕捕获,OpenCV处理图像帧,以及多线程监控非活跃状态。前端提供响应式界面,支持全屏查看和手动刷新功能。系统结构简单,包含app.py主程序、HTML模板和CSS样式文件,适合用于远程监控或演示场景。

QMxnbbb 497

Mathcad在LLC谐振变换器设计中的公式推导实战

本文通过Mathcad软件,详细演示了LLC谐振变换器设计的核心公式推导实战。文章阐述了如何利用Mathcad作为“会思考的草稿纸”,从定义基本参数、应用基波近似法(FHA)模型,到逐步推导电压增益公式及确定工作边界频率(fmin, fmax),并展示了如何通过动态参数扫描进行优化设计,帮助电源工程师高效、直观地完成理论计算,为后续仿真与实现奠定坚实基础。

q1w3e5r7t9y的博客 293

历年CSP-J(NOIP普及组)考点分析与分类汇总(纯干货)

noip/csp-j历年真题考点分类

weixin_42358969的博客 1万+

录制电脑屏幕的软件_电脑屏幕录像怎么办?高清无水印视频录制方法在这里

电脑屏幕录像怎么做?自媒体的兴起赋予了我们每个人视频创作的权力,在积累素材的时候,有时候遇到无法下载的视频,或是仅仅需要一个长视频的小部分片段,或是需要录制屏幕演示内容。那么,该怎么录制高清无水印视频呢?今天跟大家分享几种高清无水印电脑屏幕录像的方法。高清无水印录屏方法:https://dl-next.aunbox.cn/channel?channel=6aef2262​dl-next.aunbo...

weixin_39706561的博客 396

海鸥派OpenEuler开发板实战:从烧写到SSH连接的完整指南

本文提供海鸥派OpenEuler开发板从开箱到SSH远程连接的完整实战指南。详细介绍了基于海思SD3403/SS928芯片的算力开发板系统烧写、存储扩容、网络配置等关键步骤,帮助开发者快速上手这款AI边缘计算设备,并实现高效的远程开发与管理。

ruby5的博客 1120

obs多推流地址_(无人直播)教程利用OBS推流抖音直播电脑屏幕或PC游戏

  目前的火爆程度相信大家都有目共睹,也為部分活躍用戶提供直播功能,開通直播的方法有:①粉絲達到10000粉絲,官方會自動邀請妳開通直播權限。②加入和官方合作的工會,無需粉絲,也可以開通直播權限。開通直播功能後,打開直接可以用攝像頭直播,如果需要直播電腦畫面或者電腦遊戲就要用到OBS這款軟件,下面介紹利用軟件在裏直播電腦屏幕或PC遊戲。  OBS介紹  開放式廣播軟件是免費開源軟件,用於...

weixin_39999586的博客 3223

从硅片到时钟:揭秘SiTime MEMS谐振子的精密制造之旅

本文深入解析了SiTime MEMS谐振子的精密制造工艺,从硅晶圆的提纯到DRIE深硅刻蚀,再到真空封装技术,揭示了其如何克服传统石英晶振的局限。通过对比测试数据,展示了MEMS谐振子在精度、可靠性和生产效率上的显著优势,特别是在5G基站和汽车电子等领域的应用潜力。

weixin_42522953的博客 401

《QGIS快速入门与应用基础》223:纸张大小与方向(A4/A3/自定义)

本文详细介绍了QGIS布局页面设置的核心操作,重点讲解了纸张大小与方向的设置方法。文章首先指出页面设置是地图排版的基础前提,强调合理设置可避免导出打印时出现尺寸不符等问题。随后详细说明了三种打开页面设置面板的方式,并重点解析了纸张设置的要点:标准预设纸张(A4/A3等)适用于大多数场景,提供国内常用规格对照表;自定义纸张则需谨慎使用,需注意单位选择和尺寸限制。通过界面标注图和操作步骤示意图,帮助用户掌握正确的设置方法,确保最终出图符合规范要求。文章特别提醒新手要优先使用标准预设纸张,避免常见错误,为后续地图

LuckyHanMo的博客 343

电脑屏幕保护怎么取消_Bandicam Screen Recorder免费版下载-多功能电脑屏幕录制工具 v4.6.4 免费版...

  Bandicam Screen Recorder是一款多功能电脑屏幕截屏与录制工具,可以记录电脑桌面上的所有内容,包括游戏以及PC屏幕中出现的所有行为,并支持将其保存为AVI、MP4文件;该程序是最好的游戏、视频和桌面屏幕录像软件;用户还可以录制WOW、Minecraft、iTunes、YouTube、PowerPoint、网络摄像头、Skype、视频聊天、视频流以及桌面屏幕,而不会出现滞...

weixin_39628498的博客 762

lammps不同晶面建模方法汇总

Lammps lattice命令中的orient关键词可实现晶体的旋转和重定向,下面的命令中,111面的法线方向与y正方向重合,说明111面垂直于y轴。在有些模拟中,需要研究特定面的性质,比如研究110面,默认状态下,110面不是坐标平面,研究起来不方便,需要对模型进行旋转,如下图所示。经过旋转后,110面的法线方向与x轴正方向重合,旋转之后再重新对晶体进行切割,新模型的x面就是110面。需要注意的是,这种方法需要明确指定x、y、z轴的正方向分别对应哪三个面的法线方向,缺一不可。大家好,我是小马老师。

lammps_jiayou的博客 354

终极指南:Weylus自定义区域捕获功能,轻松实现精准输入映射

Weylus是一款能够将你的平板设备转变为电脑图形平板或触摸屏的强大工具,通过自定义区域捕获功能,用户可以轻松实现精准的输入映射,让平板与电脑的交互更加高效流畅。 ## 为什么选择Weylus自定义区域捕获? 在日常工作和学习中,我们经常需要在电脑上进行绘图、书写或精确操作。使用Weylus的自定义区域捕获功能,你可以将平板的输入范围精准映射到电脑屏幕的特定区域,无论是进行细致的图像编辑,还是

gitblog_01192的博客 793

PC 端微信页面拆分及 JavaFx 使用

一、前言 对于一个知识点的学习过程来说,往往使用自己熟悉的工具或方式才更易于上手。因为所有同类型的知识点在抛出复杂的流程拨云见日后,所能得到的几乎都是同样的设计思想和实现理论。 在 Java 语言桌面版开发中,直至目前共提供了三套 UI 开发方式;Awt、Swing、JavaFx,以及一些扩展组件 SWT 等。在这三套 UI 组件中,JavaFx 是最新也是最为好用的,因为他提供了丰富的功能,以及...

bugstack虫洞栈 3605

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Python电脑屏幕录制软件(提供源代码)

Python电脑屏幕录制软件(提供源代码)

修行之路 241

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: ethereal的捕获过滤器和显示过滤器
下一篇: 基于Tiny C compiler的c脚本混合编程方法
matlab2000
博客等级 码龄24年 37粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值