將HDC轉化成BMP保存(轉)

HDC 保存为BMP图片步骤 // 1. 获取DC的HBITMAP HBITMAP hBitmap = (HBITMAP)::GetCurrentObject(hDC, OBJ_BITMAP); if(0 == hBitmap) { return false; } // 2. 通过HBITMAP获取BITMAP BITMAP bitmap; ::GetObject(hBitmap, sizeof(BITM 阅读详情

//========================================================================
//TITLE:
//    将HDC保存为BMP文件
//AUTHOR:
//    norains
//DATE:
//    Friday 25-September-2009
//Environment:
//    WINDOWS CE 5.0
//========================================================================

    HDC在MSDN中的全称为:The handle of device context。通常,我们都是用来做相应的显示操作。
   
    熟悉WIN32的朋友对于其应该不会陌生,经常采用GetDC,GetWindowDC等等来获取其句柄。而用得最多的,可能就是BeginPaint,如:

   使用起来非常简单,但如果想将其内容保存为普通的图像文档,可就没那么容易。确切地说,在只知道HDC句柄的情况下,我们是无法保存其内容的;但我们可以剑走偏锋,将HDC的内容写到一个缓存中,然后我们再保存该缓存的内容即可。
  
   听起来很简单,却又像很复杂,不是么?没关系,我们现在一步一步来。
  
  
   首先,我们需要一个HDC的句柄。如同前面所说,你可以有多种方法,比如GetDC,GetWindowDC,甚至是CreateDC。反正呢,你用什么方法我不管,我只要有一个HDC的句柄就好了。
  
   有了HDC的句柄,接下来我们所需要做的是,知道这HDC的大小,也就是宽度和长度。这个不难,我们只要简单地调用GetDeviceCaps,然后参数给予HORZRES或VERTRES即可:
 

    为什么要知道大小呢?因为我们要用它来创建缓存。而这缓存,说白了,其实就是一个BMP格式的数据结构而已。
   
    为了创建这个关键的缓存,我们必须调用CreateDIBSection函数,而该函数形参又用到BITMAPINFOHEADER,所以我们的一切,就先从填充该结构体开始。
   
    该结构体定义如下:

    结构体里面还有一个BITMAPINFOHEADER,其定义如下:

    这么多变量,是不是有点头晕?大可不必紧张,其实我们只需要填充其中几个,其它统统置为0即可:

    一切从最简单做起,对于BMP而言,最简单的自然是24位位图,这就是为什么biPlanes和biBitCount分别设置为1和24的原因。
   
    填充完BITMAPINFO结构,我们还是不能马上调用CreateDIBSection,因为形参中还有一个HDC。虽然我们可以直接采用已知的HDC句柄,但接下来还要将创建的HBITMAP和HDC相连接,所以我们还是先创建一个缓存DC:

    一切准备就绪之后,就调用CreateDIBSection吧:

    pData是分配的一个内存空间,将来用来存储HDC的内容,只不过现在一切都是空的。如果你将这数据保存出来,你会发现一团漆黑。
   
    将HBITMAP和HDC结合:

    至此为止,我们前期工作已经准备就绪,我们只需要将HDC的内容用BitBlt绘制到缓存中即可:

  这里其实还有一个小技巧,如果你是想绘制HDC的某个区域,你只需要用StretchBlt替代即可:

    喜欢追究问题的你,也许会发现,在调用该函数之后,pData所指向的内存缓冲区已经改变。是的,没错,这些改变的数据就是我们所需要的。接下来我们所需要做的仅仅是,将这数据按BMP文件的格式,保存下来即可。
   
    BMP文件格式其实很简单,最开始是文件头信息,然后是图片信息,接下来是数据。我们只需要按照这格式,顺序将数据写入即可。
   
    文件头信息和图片信息,微软已经为我们定义好了相应的结构体:
   
    BMP信息:

    文件头信息:

    我们首先填充这两个结构体数值:

    接下来的事情,估计大家都轻车熟路了。创建文件,然后写入数据,保存,完毕。

设备上下文的初级讨论(HDC--Handle of Device Context) 经常使用vc++进行窗口类设计的程序员经常会用到设备上下文dc来做一些画图的工作,但是设备上下文到底是什么呢?   当我们在屏幕上显示一些图形时,会调用底层显示芯片的一些绘图函数,如果每次我们做画线这样的工作都要调用显示芯片的提供的函数或类进行工作的时候,显然不太现实。而且这样也影响了程序的可移植性。因为各种显示芯片设计的绘图函数是不尽相同的。所以在vc++的编程过程中,我们把这个工作交给系统来 阅读详情

相关推荐

VC下把HBITMAP保存为bmp图片

//VC下把HBITMAP保存为bmp图片 BOOL SaveBmp(HBITMAP hBitmap, CString FileName) { HDC hDC; //当前分辨率下每象素所占字节数 int iBits; //位图中每象素所占字节数 WOR

MoXiaoRab的专栏 1万+

【转】如何从HDC中获取位图信息

// 从DC中获取位图 int GetBmpFromDc() {     HDC          hMemDC;     HBITMAP      hBmp;     BITMAP       bmp;     HANDLE       hOld;     HDC          hDC;     RECT         rcWnd;     // 获取子窗口的绘图区域

qyxqyxqyx的专栏 3848

【ffmpeg入门教程】(3).HDC保存BMP

http://blog.youkuaiyun.com/guo83851250/article/details/54882435 【ffmpeg入门教程】(3).HDC保存BMP

GDI+ 保存HDC为位图文件

//GDI+为图片的加载、存储,屏蔽了内部编解码、压缩解压缩等的具体细节,给程序员带来了极大的方便 //目前版本的GDI+支持bmp jpeg gif tiff png等几种格式 //下面的程序基本思路是先将目标DC上的内容存到内存BITMAP //再使用GDI+Bitmap::FromHBITMAP加载内存位图,并保存成文件 //此版本在Win32和MFC环境下测试通过 // //使用GDI+ 保存HDC为位图文件 #include <rpc.h> #in...

yaowang107的博客 3842

【iceberg数据一致性】iceberg如何保证高并发数据一致性

那么在高并发的时候,同时操作某张表时是如何运作的呢?其实这里iceberg引用了乐观锁的方法。其实在写入数据的时候是有一个验证的操作的,即在准备写入时会检查原文件和带写入文件的差异,如果存在本次写入数据以外的数据,则代表有其他操作已经更新了原文件,那么本次写入会取消,并重试写入的步骤,知道验证完成,写入完成,如此就保证了数据的一致性,并且也解决了HMS锁的问题。在使用iceberg写数据时,一直弄不清楚为什么iceberg写入快,并且能够保证数据的一致性。今天决定搞清楚这个问题,经过查询和理解,写下来。

你的博客 1045

Cadence 16.6与17.4双版本共存避坑指南:从安装顺序到环境变量配置

本文是一份详细的Cadence 16.6与17.4双版本共存实战指南。针对硬件工程师和PCB设计者同时处理新旧项目的需求,文章深入剖析了版本冲突根源,并提供了从安装顺序、环境隔离到故障排查的完整解决方案。核心在于通过环境变量精细化管理与脚本控制,实现两个版本的稳定共存与无缝切换,有效解决了文件关联混乱、交互布局失效等常见问题。

html8的博客 982

ffmpeg 截图 java_如何在Windows(ffmpeg等)中使用Java快速拍摄桌面截图?

小编典典使用内置的 Robots类比 其他Java库更容易,并且可能满足您的需求。如果您需要一个> = 30fps的流畅视频(每秒超过30个屏幕截图),则应首先尝试使用Robots方法以及其中 的屏幕截图异步存储功能来 改善性能。如果它对您不起作用,请尝试使用 JNA ,它几乎可以保证(即使更复杂)也可以正常进行屏幕捕获。机器人接近机器人课确实可以完成您想要的事情,大多数使用机器人的屏幕捕获...

weixin_31774841的博客 550

从零到一:uniPush2.0全链路集成与多厂商通道配置实战

本文提供了uniPush2.0从零开始的全链路集成与多厂商通道配置实战指南。详细讲解了DCloud平台配置、uniCloud云函数开发、客户端CID获取与消息监听,并重点攻克了华为、小米、OPPO、vivo等主流厂商推送通道的配置难点与避坑技巧,帮助UniApp开发者实现“一次集成,全端覆盖”的高效消息推送方案。

onion的博客 434

将HDC保存为BMP文件

将HDC保存为BMP文件

ytfgff的博客 2584

Altium AD20差分对走线设置方法

AD20的PCB差分对走线设置 1、原理图添加差分对 先在原理图中,讲要设置差分对的网络对添加网络标签。 名称前面的内容要相同,后缀用 _P 和 _N 加以区分。 最后使用 放置差分对,将两个网络标记。 2、编译,更改到PCB 编译,更新到PCB,确认差分对网络的出现。 验证更改,执行更改。将改动更新到PCB中。 PCB中,可通过 右下角 Panels - 调出 PCB 显示。来对已添加的差分对进行查看。 这时原本的走线有一点点小问题,需要删掉原来走线,设置差分对规则,并重新布线。

Mark_md的博客 3万+

电脑卸载神器Revo Uninstaller Pro,彻底清残留,终身无限制使用

打开软件后,它会自动扫描并列出电脑里所有已安装的程序,小到各种插件、大到专业设计软件和驱动程序,哪怕是隐藏的系统组件,都能给你扒出来,还会自动分类整理,加上搜索功能能快速定位目标软件,就算是电脑小白,也能轻松上手。卸载彻底无残留:能直接代替系统自带的 “添加 / 删除程序”,不光能正常卸载软件,还会通过内置卸载程序配合残留扫描,把软件留下的残留文件、垃圾还有注册表项都扫得明明白白,扫描强度有三档可以选,想清理得多干净都能自己定,删除之后电脑立马清爽不少。电脑用久了是不是越来越慢?

qq_75153390的博客 1750

bmp转jpg、jpg转bmp、截屏保存jpg

bmp转jpg、jpg转bmp、截屏保存jpg jdi+实现: int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num = 0; // number of image encoders UINT size = 0;

点滴积累 747

(11-3-03)多任务与元强化学习:综合实战:基于元强化学习的迷宫导航系统(3)

本文介绍了策略网络隐空间可视化的实现方法及其在强化学习中的应用。通过设计visualize_latent_space函数,使用t-SNE算法将高维隐空间特征降维至二维进行可视化,直观展示策略网络在不同任务中的特征分布。文章详细阐述了实现流程:状态收集、t-SNE降维和可视化绘图,并提供了完整的Python代码示例。实验结果表明,该方法能有效分析策略网络的学习过程与适应能力,为优化模型提供重要依据。同时,文章还介绍了主程序的完整流程,包括环境初始化、元智能体训练与评估、学习策略比较等环节,最后对实验结果进行可

码农三叔 1043

WinCE将HDC保存为BMP文件

<br />HDC在MSDN中的全称为:The handle of device context。通常,我们都是用来做相应的显示操作。<br />熟悉WIN32的朋友对于其应该不会陌生,经常采用GetDC,GetWindowDC等等来获取其句柄。而用得最多的,可能就是BeginPaint,如:case WM_PAINT:      HDC hdc = BeginPaint(hWnd,&ps);      ...      EndPaint(hdc,&ps);      break;  <br />使用起来非

zmq5411的专栏 1111

ABAP CURR Data Type 深度解析与实战案例

CURR 数据类型是 SAP ABAP 中为处理货币金额而设计的一种特殊数据类型。CURR 数据类型能够自动根据关联的货币代码字段(例如 WAERS)确定小数位数,从而保证金额数据的精度与正确性。CURR 类型通常在 SAP 数据字典中使用,常见于各类业务数据表中,如会计凭证、销售订单等场景中,用于存储货币金额。CURR 数据类型底层实现上类似于 DEC 数据类型,但其特别之处在于与货币代码字段的绑定,这使得金额的格式化和显示可以自动匹配相应的货币规则。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 880

Unreal5从入门到精通之EnhancedInput增强输入系统详解

从Unreal5开始,老版的输入系统,正式替换为EnhancedInput增强型输入系统,他们之间有什么区别呢?如果有使用过Unity的同学,大概也知道,Unity也在2020版本之后逐渐把输入系统也升级成了新版输入系统,为什么Unreal和Unity都热衷于升级输入系统呢?这之间又有什么联系呢?官方:增强输入EnhancedInput希望这篇文章能够对你有所帮助。

TxNet 945

WinCE实现屏幕截图并保存为BMP文件

本文将在Windows Mobile上实现通过句柄获得HDC并保存为BMP文件,从而实现全屏截图以及窗口截图。效果图如下:  主要接口如下:  BOOL SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath);传入句柄以及文件路径,如果句柄为空则截取整个屏幕。 LPCTSTR GetFil

王云腾的专栏 3278

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

将屏幕和MFC程序界面保存成bmp格式图片保存

将屏幕保存为图片,使用vs2008编译通过。 #include "stdafx.h"    #include    #include       int __stdcall WinMain(               HINSTANCE hInstance,               HINSTANCE hPrevInstance,               LPSTR

ghevinn欢迎您光临 9277

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: VB.NET編程中常見錯誤
下一篇: 保存BMP文件
studyandhappy
博客等级 码龄17年 46粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值