将HBITMAP保存为文件_hbitmap 保存文件-程序员宅基地

技术标签: MFC/VC++  file  null  bi  colors  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

bool HBITMAPToBmp ( HBITMAP hBitmap , const CString & strFileName

)

{

 

 

if ( hBitmap == NULL

)

 

 

return false

;

 

 

HDC hDC

;

 

 

int iBits ;

//当前分辨率下每象素所占字节数

 

 

WORD wBitCount ;

//位图中每象素所占字节数

 

 

DWORD dwPaletteSize =0;

//定义调色板大小

 

 

DWORD dwBmBitsSize =0;

//位图中像素字节大小

 

 

DWORD dwDIBSize =0;

//位图文件大小

 

 

DWORD dwWritten =0;

//位图文件大小 写入文件字节数

 

 

BITMAP Bitmap ;

//位图属性结构

 

 

BITMAPFILEHEADER bmfHdr ;

//位图文件头结构

 

 

BITMAPINFOHEADER bi ;

//位图信息头结构

 

 

LPBITMAPINFOHEADER lpbi = NULL ;

//指向位图信息头结构

 

 

HANDLE hDib , hPal , hOldPal = NULL ;

//定义文件,分配内存句柄,调色板句柄

 

 

//计算位图文件每个像素所占字节数

 

 

hDC = CreateDC ( _T ( "DISPLAY" ), NULL , NULL , NULL

);

 

 

iBits = GetDeviceCaps ( hDC , BITSPIXEL ) * GetDeviceCaps ( hDC , PLANES

);

 

 

DeleteDC ( hDC

);

 

 

if ( iBits

<= 1)

 

 

wBitCount

= 1;

 

 

else if ( iBits

<= 4)

 

 

wBitCount

= 4;

 

 

else if ( iBits

<= 8)

 

 

wBitCount

= 8;

 

 

else

 

 

wBitCount

= 24;

 

 

GetObject ( hBitmap , sizeof ( Bitmap ),( LPSTR )& Bitmap

);

 

 

bi . biSize = sizeof ( BITMAPINFOHEADER

);

 

 

bi . biWidth = Bitmap . bmWidth

;

 

 

bi . biHeight = Bitmap . bmHeight

;

 

 

if ( Bitmap . bmWidth < 100 || Bitmap . bmHeight

< 100)

 

 

return false

;

 

 

bi . biPlanes

= 1;

 

 

bi . biBitCount = wBitCount

;

 

 

bi . biCompression = BI_RGB

;

 

 

bi . biSizeImage

= 0;

 

 

bi . biXPelsPerMeter

= 0;

 

 

bi . biYPelsPerMeter

= 0;

 

 

bi . biClrImportant

= 0;

 

 

bi . biClrUsed

= 0;

 

 

dwBmBitsSize = (( Bitmap . bmWidth * wBitCount + 31) / 32) * 4 * Bitmap . bmHeight

;

 

 

//为位图内容分配内存

 

 

hDib = GlobalAlloc ( GHND , dwBmBitsSize + dwPaletteSize + sizeof ( BITMAPINFOHEADER

));

 

 

lpbi = ( LPBITMAPINFOHEADER ) GlobalLock ( hDib

);

*

 

lpbi = bi

;

 

 

hPal = GetStockObject ( DEFAULT_PALETTE );

//处理调色板

 

 

if ( hPal

)

{

 

 

hDC = :: GetDC ( NULL

);

 

 

hOldPal = :: SelectPalette ( hDC , ( HPALETTE ) hPal , FALSE

);

 

 

RealizePalette ( hDC

);

}

 

 

//获取该调色板下新的像素值

 

 

int nRet = GetDIBits ( hDC

,

 

 

hBitmap

,

0,

(

 

UINT ) Bitmap . bmHeight

,

(

 

LPSTR ) lpbi + sizeof ( BITMAPINFOHEADER )+ dwPaletteSize

,

(

 

BITMAPINFO *) lpbi

,

 

 

DIB_RGB_COLORS

);

 

 

if (0 == nRet

)

{

 

 

nRet

= 0;

}

 

 

//恢复调色板

 

 

if ( hOldPal

)

{

::

 

SelectPalette ( hDC , ( HPALETTE ) hOldPal , TRUE

);

 

 

RealizePalette ( hDC

);

::

 

ReleaseDC ( NULL , hDC

);

}

 

 

//设置位图文件头

 

 

bmfHdr . bfType = 0x4D42;

// "BM"

 

 

dwDIBSize = sizeof ( BITMAPFILEHEADER ) + sizeof ( BITMAPINFOHEADER ) + dwPaletteSize + dwBmBitsSize

;

 

 

bmfHdr . bfSize = dwDIBSize

;

 

 

bmfHdr . bfReserved1

= 0;

 

 

bmfHdr . bfReserved2

= 0;

 

 

bmfHdr . bfOffBits = ( DWORD ) sizeof ( BITMAPFILEHEADER ) + ( DWORD ) sizeof ( BITMAPINFOHEADER ) + dwPaletteSize

;

 

 

//创建位图文件

 

 

HANDLE fh = CreateFile ( strFileName . operator LPCTSTR (), GENERIC_WRITE ,0, NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN , NULL

);

 

 

if ( fh == INVALID_HANDLE_VALUE

)

{

 

 

int x = GetLastError

();

 

 

GlobalUnlock ( hDib

);

 

 

GlobalFree ( hDib

);

 

 

return FALSE

;

}

 

 

//写入位图文件头

 

 

WriteFile ( fh , ( LPSTR )& bmfHdr , sizeof ( BITMAPFILEHEADER ), & dwWritten , NULL

);

 

 

//写入位图文件其余内容

 

 

WriteFile ( fh , ( LPSTR ) lpbi , dwDIBSize - sizeof ( BITMAPFILEHEADER ), & dwWritten , NULL

);

 

 

//清除

 

 

CloseHandle ( fh

);

 

 

GlobalUnlock ( hDib

);

 

 

GlobalFree ( hDib

);

 

 

return true

;

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/robinjwong/article/details/4704776

智能推荐

FCPX:快速时尚视频转场Stupid Raisins Fast Pop下载-程序员宅基地

文章浏览阅读2.1k次。今天小编带你了解一款 Stupid Raisins Fast Pop是一个fcpx效果插件,它允许您在Final Cut Pro,Motion,Premiere Pro和After Effects中使用。Fast Pop是快速,时尚的视频过渡,为您的视频项目增添了活力,在几秒钟内为您的视频添加专业的转换。欢迎需要的朋友前来下载体验!!FCPX插件:Stupid Raisins Fast Pop安装方法 (点击️上方链接看详细安装教程)需要搭配final cut pro x视频制作软件一起使用效_fast pop下载

psql: error: connection to server on socket “/opt/postgresgl/pgdata/.s.PGSQL.5432“ failed_psql: error: connection to server on socket "/var/-程序员宅基地

文章浏览阅读3.1k次。psql: error: connection to server on socket "/opt/postgresql/pgdata/.s.PGSQL.5432" failed: 没有那个文件或目录。PostgreSQL数据库psql连接报错connections on Unix domain socket “/opt/postgresgl/pgdata/.s.PGSQL.5432“?1.查看查看参数unix_socket_directories。重新postgreSQL服务,问题解决。_psql: error: connection to server on socket "/var/run/postgresql/.s.pgsql.54

树莓派3 ROS语音包开发之音频采集_树莓派收集声音-程序员宅基地

文章浏览阅读9.8k次。树莓派3 ROS语音包开发之音频采集谈到语音交互,简单步骤你我都能想到,无非就是以下几个步骤:1、语音采集 2、语音识别 3、语义理解 4、语音合成之前移植了ROS代码包,很多语音交互方面只有英文,对于中文识别来说,想要找到恰当的包比较困难,其中的难点接下来会一一来探究并找出相应的办法。该博客先不讨论后续内容,现在只着重介绍步骤一,即音频采集。音频采集首先要了解_树莓派收集声音

Noip DP 总结 1_noi dp-程序员宅基地

文章浏览阅读461次。对各位学NOI的大佬对于DP的总结的总结。———-DP数据范围:———1} 15,20 -> 状压/暴搜2} 30 -> 折半搜索-二分搜索3} 50 -> N^4 DP4} 100~200 -> Floyed,图论等5} 1000~2000 -> N^2 DP6} 1e5 -> ……可能不是DP7} 1e6_noi dp

JS数组中 reduce() 方法 数组对象去重_js使用reduce去重-程序员宅基地

文章浏览阅读2.5k次,点赞3次,收藏8次。参考引用:数组里面对象去重的3种方法: https://blog.csdn.net/l284969634/article/details/91397332js数组去重的多种方法: https://blog.csdn.net/linglingzi001/article/details/107772411JS中reduce方法: https://blog.csdn.net/hope93/article/details/86528183Array.reduce()方法解析: https://blog.cs_js使用reduce去重

深入浅出分析Electron打包插件electron-builder配置_electron-builder 固定 打包版本-程序员宅基地

文章浏览阅读1.7k次。```json{ "name": "Umeet", // 产品名称 "version": "3.2.0", // 产品版本 "private": true, // 是否私有 "main": "./src/main.js", // 程序入口文件 "author": { // 发布者信息 win-属性可见,mac在关于Umeet中可见 "name": "SYSTEC" }, "desc._electron-builder 固定 打包版本

随便推点

C语言中32个关键字详解_ansi c32个关键字的意思-程序员宅基地

文章浏览阅读2.1w次,点赞147次,收藏1.1k次。标准C语言的32个关键字_ansi c32个关键字的意思

Windows程序设计第五版源代码---BEEPER2_vc程序设计 第5版-程序员宅基地

文章浏览阅读171次。源代码如下:#include <windows.h>#define ID_TIMER 1 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);VOID CALLBACK TimerProc(HWND, UINT, UINT, DWORD);int WINAPI WinMain(HINSTANCE hInstance..._vc程序设计 第5版

深度相机工作原理_深度相机原理-程序员宅基地

文章浏览阅读4.1k次。转自:https://blog.csdn.net/electech6/article/details/78707839结构光法:为解决双目匹配问题而生深度图效果:结构光vs.双目投射图案的编码方式 直接编码 ..._深度相机原理

斐讯 N1 降级、刷机及 Armbian 安装 [2019.7.23]_斐讯n1官方降级工具-程序员宅基地

文章浏览阅读1.4w次,点赞2次,收藏19次。最前最近捡垃圾不断,之前购买了斐讯遗产 K2P(真香,最近刷了 OpenWrt)、T1(刷了电视盒子)和蜗牛星际(刷了黑群晖),最近又捡了台斐讯 N1,主要用于做一些简单的爬虫和 Adguard Home 服务。其实原先有过一台树莓派 3B,但是 emmmm 吃灰了一年,然后二手卖了。虽然近期树莓派 4 发布了,性能有较大提升,但由于价格的原因,还是 N1 香。刷机过程由于已有的几篇文章有些内容..._斐讯n1官方降级工具

Linux服务器移动文件命令_linux移动文件命令-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏7次。Linux服务器移动文件命令_linux移动文件命令

123-程序员宅基地

文章浏览阅读163次。阵容:4冰川(狂战士4、背叛者1、绝命巫师2、占卜师3) 占4人口3战士(船长4+随便一个战士,有钱就买末日审判官4) 占2人口2术士甚至4术士(灵魂收割4、暗之灵5、不免预言家5) 占1\3人口2刺客(光羽刺客4、幽影刺客3)刺客是有冰川加攻速也很厉害 占2人口阵容核心就是狂战士,2星是基本,3星就无敌。配合暗之灵可以融化对面。曾经的骑士的抗性持续3秒,6骑3龙+暗之灵...

推荐文章

热门文章

相关标签