位图的保存

VC下把HBITMAP保存为bmp图片 //VC下把HBITMAP保存为bmp图片 BOOL SaveBmp(HBITMAP hBitmap, CString FileName) { HDC hDC; //当前分辨率下每象素所占字节数 int iBits; //位图中每象素所占字节数 WOR 阅读详情
GDI中位图对象是很常见的GDI对象,但是无论是SDK,还是MFC都没有提供现在的函数或是方法来将一个位图对象保存为一个BMP文件,这里介绍一下保存方法。
位图文件格式:
DIB文件有四个主要部分:
文件表头(BITMAPFILEHEADER)
信息表头  (BITMAPINFOHEADER)
调色板(不一定有) 
位图图素位
而一个位图对象和上述唯一不同在于它没有文件表头。
相关数据结构:
(1)文件表头
typedef struct tagBITMAPFILEHEADER { 
  WORD    bfType; //BMP文件类型,总是字符BM,十六进制为0x4d42
 DWORD   bfSize; //BMP文件大小,包含这个结构在内。
 WORD    bfReserved1; 
  WORD    bfReserved2; //以上均保留为0
 DWORD   bfOffBits; //是一个偏移量,指出了文件中图素位开始位置的字节偏移量
} BITMAPFILEHEADER, *PBITMAPFILEHEADER; 
(2)信息表头
typedef struct tagBITMAPINFOHEADER{
 DWORD biSize; //结构的大小
 LONG   biWidth; //位图的宽度
 LONG   biHeight; //位图的高度
 WORD   biPlanes; //必须是1
 WORD   biBitCount; //指出每一个像素要用的bit位。
 DWORD biCompression; //指出是否是压缩的,以及压缩方式
 DWORD biSizeImage; //指出图像的尺寸
 LONG   biXPelsPerMeter; //水平基线
 LONG   biYPelsPerMeter; //坚直基线
 DWORD biClrUsed; //被用的颜色数
 DWORD biClrImportant; //重要的颜色数
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
(3)调色板结构:
typedef struct tagRGBQUAD // rgb
{
           BYTE rgbBlue ;     // blue level
           BYTE rgbGreen ;    // green level
           BYTE rgbRed ;      // red level
           BYTE rgbReserved ; // = 0
}RGBQUAD ;
注意这个结构应该是一个数组,在256色及以下的BMP文件中存在,数组的长度关键看颜色数。
BITMAP定义了一个位图的类型、长度、宽度、颜色格式等,这个结构一般用GetObject来获得。定义如下:typedef struct tagBITMAP {
 LONG   bmType; //类型,不过总是为0
 LONG   bmWidth; //宽度,总是大于0
 LONG   bmHeight; //高度,总是大于0
 LONG   bmWidthBytes; //MSDN上解释说是指定每一个扫描行的字节数。
 WORD   bmPlanes; //指定调色板数目
 WORD   bmBitsPixel; //指示一个像素所要求的byte位
 LPVOID bmBits; //指定一个数组指针,这个数组大约应该是保存位图数据的。
} BITMAP, *PBITMAP
一个位图对象也就是存在内存中的位图,它与存在硬盘上的BMP文件相比,唯一的区别就是它没有BITMAPFILEHEADER这个文件信息头,其余部分是完全相同的,所以我们要做的就是先构造一个文件信息头,写入文件中,然后将内存中的位图写入文件。
       源代码如下:(只写主要部分)
WORD wbitsCount;//位图中每个像素所占字节数。
       DWORD dwpalettelsize=0;//调色板大小
       DWORD dwbmdibitsize,dwdibsize,dwwritten;
       BITMAP bitmap;//定义了位图的各种的信息。
       BITMAPFILEHEADER bmfhdr;//定义了大小、类型等BMP文件的信息。
       BITMAPINFOHEADER bi;
       LPBITMAPINFOHEADER lpbi;
       HANDLE fh,fdib;
GetObject(hBitmap,sizeof(BITMAP),(void *)&bitmap);//得到BITMAP结构。
       //以下代码是用BITMAP的信息填充BITMAPINFOHEADER结构
       wbitsCount=bitmap.bmBitsPixel;
bi.biSize=sizeof(BITMAPINFOHEADER);
       bi.biWidth=bitmap.bmWidth;
       bi.biHeight=bitmap.bmHeight;
       bi.biPlanes=1;
       bi.biBitCount= bitmap.bmBitsPixel ;
       bi.biClrImportant=0;
       bi.biClrUsed=0;
       bi.biCompression=BI_RGB;
       bi.biSizeImage=0;
       bi.biYPelsPerMeter=0;
       bi.biXPelsPerMeter=0;
//以下代码是获取调色板的长度,调色板现在的用处很少,因为256色的位图已经不多了。
       if(wbitsCount<=8)
              dwpalettelsize=(1<<wbitsCount)*sizeof(RGBQUAD);
//计算位图的大小,并分配相应的内存空间,注意的是没有分配BITMAPFILEHEADER。
       dwbmdibitsize=((bitmap.bmWidth*wbitsCount+31)/8)*bitmap.bmHeight;
       fdib=GlobalAlloc(GHND,dwbmdibitsize+dwpalettelsize+sizeof(BITMAPINFOHEADER));
       lpbi=(LPBITMAPINFOHEADER)::GlobalLock(fdib);
       *lpbi=bi;//将bi中的数据写入分配的内存中。
       hdc=::GetDC(NULL);
       GetDIBits(hdc,hBitmap,0,(UINT)bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwpalettelsize,(BITMAPINFO *)lpbi,DIB_RGB_COLORS);
/*GetDIBits是最重要的函数,真正获得位图数据的工作就由它完成,它第一个参数为HDC,第二个参数为位图句柄,第三个参数为扫描行的开始行,一般为0,第四个为结束行,一般就是高度,第四个参数最重要,它表示接收数据的起始地址,这个地址一般是在调色板之后。第五个参数指的是接收BITMAPINFO结构的地址,这个结构上面没有写,它其实就是BITMAPINFO结构加上调色板信息。最后一个参数是格式。一般是DIB_RGB_COLORS*/
//创建文件以及文件信息头
fh=CreateFile(FileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
       if(fh==INVALID_HANDLE_VALUE)
              return FALSE;
bmfhdr.bfType=0x4d42;//BMP类型,一定要这样写
       dwdibsize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwbmdibitsize+dwpalettelsize;//文件总长,由几个部分组成
       bmfhdr.bfSize=dwdibsize;
       bmfhdr.bfReserved1=0;
       bmfhdr.bfReserved2=0;
bmfhdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwpalettelsize;//位图数据相对于文件头的偏移量
//将文件信息头写入文件
WriteFile(fh,(LPSTR)&bmfhdr,sizeof(BITMAPFILEHEADER),&dwwritten,NULL);
//将数据写入文件,包含BITMAPINFO结构、调色板、数据
WriteFile(fh,(LPSTR)lpbi,dwdibsize,&dwwritten,NULL);
//关闭相关句柄
::GlobalUnlock(fdib);
       ::GlobalFree(fdib);
       ::CloseHandle(fh);
       return TRUE;
用C++读取、修改和保存位图 用C++读取、修改和保存位图   该示例用C++读取、修改位图,通过它我们可以了解位图的文件结构,对图像处理的理解很有帮助。下面是全部的源码:  #include #include #include /***********************变量的定义***********************************/unsigned char* pBmpBu 阅读详情

相关推荐

VC/MFC中位图保存的实现方法

在MFC中位图操作,经常要涉及到关于位图的保存

清风留影的专栏 5869

如何将位图对象保存为BMP文件

 GDI中位图对象是很常见的GDI对象,但是无论是SDK,还是MFC都没有提供现在的函数或是方法来将一个位图对象保存为一个BMP文件,这里介绍一下保存方法。位图文件格式:DIB文件有四个主要部分:文件表头(BITMAPFILEHEADER)信息表头  (BITMAPINFOHEADER)调色板(不一定有)  位图图素位而一个位图对象和上述唯一不同在于它没有文件表头。

wltg2001的专栏 1万+

DIB位图(Bitmap)的读取和保存

设备无关位图(Device Independent Bitmap)是可以保存在磁盘的位图文件,可以从磁盘读取到内存或者从内存保存到磁盘上。它的文件结构是标准化的,可以在Windows/Linux/Unix等平台上显示相同的效果。本文主要介绍了 1. 如果将位图文件从磁盘读到内存中 2. 在内存中对位图文件进行操作后,如何将位图保存到磁盘1 读取位图到内存中1.1 DIB文件结构要将位图文件(.b

BrookIcv的博客 5397

图像相关(二) - System.Drawing.Bitmap 的使用

//缩放图像 private void ScaleBitmap(string imgUrl) { //源图像 System.Drawing.Bitmap oldBmp = new System.Drawing.Bitmap(imgUrl); //新图像,并设置新图像的宽高

清风ai明月的专栏 2万+

用DirectShow抓取视频帧,保存为位图

文字部分转载于:http://www.vckbase.com/index.php/wv/718 代码部分原文有很多错误,已经修正,另外加入了一些修改   工具设置:         先说说我使用的VC 6.0的设置,一般而言,安装完DirectX 9.0b SDK后,会自动设置好VC,用户无需手动干预,如果编译过程中出现错误,请检查VC是否包含了DirectX SDK的头文件和库文件,方

Will 2324

mfc下对bmp图片顺时针90度旋转,灰度,分块的操作

是一个mfc单文档对位图进行操作的简单小程序,包含顺时针旋转90度,灰度化,分块,图像的保存和显示。因为作业要求比较简单,交的时候又把一些操作改简单了,可以在一些函数内对变量进行一些简单操作增加功能。内含完整程序的百度网盘地址。

任意角度旋转Bitmap

        ///         /// 任意角度旋转         ///         /// 原始图Bitmap         /// 旋转角度         /// 输出Bitmap         public static Bitmap BmpRotate(Bitmap bmp, double angle)         {             int w

jiangyongtao的专栏 5056

labview自动截屏程序

自动截取电脑当前界面的界面图片,在特定的场合可以得到很好的应用

位图保存为文件

BOOL CRadPupView::SaveBitmapToFile(HBITMAP hBitmap,CString lpFileName) { HDC hDC; //设备描述表 int iBits; //当前显示分辨率下每个像素所占字节数 WORD wBitCount; //位图中每个像素所占字节数 DWORD dw

ZaneZhu的专栏 594

MFC中旋转BMP位图

MFC中旋转BMP位图 MFC中旋转BMP位图 MFC中旋转BMP位图 MFC中旋转BMP位图

WRF和WPS安装和编译时遇到的问题

检查是否自己netcdf和Fortran编译器一致。解决办法:修改configure.wps里的路径。如果没问题且wrf已成功编译,考虑重新。path修改为jasper在的路径。

m0_54898744的博客 1838

用 Java 保存位图文件

虽然 Java 提供了几种打开图像的机制,但保存图像并不是它的强项。这篇技巧将讲述如何将图像保存在 24 位位图文件中。另外,Jean-Pierre 还提供了将图像文件写入位图文件所需的全部代码。  这篇技巧是 Java 技巧 43 的补充,那篇技巧说明了在 Java 应用程序中加载位图文件的过程。本月我再提供一篇教程,说明如何将图像保存在 24 位位图文件中,其中还包含将图像对象写入位图文件的代

wxyxl的专栏 1535

ADS谐波平衡仿真自动优化报错?三步搞定HB控件设置(附常见错误排查)

本文针对ADS谐波平衡仿真在自动优化中常见的报错问题,提供了三步核心排查法。首先检查并禁用HB控件中可能导致冲突的小信号仿真模式,其次合理化仿真频率与扫描参数设置,最后审视优化变量与目标的定义。通过精准配置HB控件以适配自动优化流程,能有效解决大多数仿真失败问题,确保非线性电路设计顺利进行。

c2d3e4f的博客 792

将位图句柄保存为BMP文件

BOOL SaveToFile(HBITMAP hBitmap, LPCTSTR lpszFileName){  HDC hDC;  //当前分辨率下每象素所占字节数  int iBits;  //位图中每象素所占字节数  WORD wBitCount;  //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数  DWORD dwPaletteSize=0, dwBmBits

马说@优快云 3410

基于PLC的矿用排水控制系统设计【附代码】

(3)矿用排水控制系统的软件设计 研究设计了矿用排水控制系统的软件,包括PLC程序的编写和上位机监控画面的设计。(2)矿用排水控制系统的硬件设计 研究对矿用排水控制系统的硬件进行了选型和设计,包括矿用多级耐磨离心泵、三相异步防爆电机等执行设备的选型,以及控制系统所需用到的各类型传感器、PLC的I/O点分配及选型。(1)矿用排水控制系统的现状分析 研究首先对矿井排水系统的现状进行了分析,指出了现有系统存在的问题,如自动化程度低、劳动强度大、设备维护困难等。✅ 具体问题可以私信或查看文章底部二维码。

lagougongzuoshi的博客 1175

网络变压器等效电路及网络变压器中间抽头作用详解

       华强盛电子导读:要详细了解网络变压器周边EMC管控及网络变压器BOB-SMITH电路的连接原理,首先我们对网络变压器的认识及其电路各参数影响都要有个简要的认识,本文,对非理想网络变压器等效电路做一个详细的分析,其中重点讨论一下网络变压器中间抽头的作用其影响                          网络变压器等效电路及                        ...

网络变压器专业资料 6006

位图文件的保存

其中,depth是像素深度也就是每个像素所占用的字节数(24位是3,32位为4)。了解位图的存储格式后,将位图保存到磁盘还是挺简单的,这里是基于Windows SDK的实现,有机会要自己定义各部分的结构体,实现位图文件的读写。2. bfSize,文件的大小,也就是文件头信息、位图头信息和位图数据在一起的大小。1. byType,文件类型,必须为0x4D42(BM),表示是位图文件。3. bfOffBits,偏移量,位图数据相对于文件头的便宜量。填充后各部分信息后,依次写入到磁盘即可。

可为测控的机器视觉专栏 521

从零开始:如何用大语言模型构建你的第一个路径规划智能体

本文详细介绍了如何利用大语言模型(LLM)构建路径规划智能体,从基础概念到实战案例,涵盖TSP和CVRP问题的解决方案。通过选择合适的LLM模型、设计有效的提示工程和实现自我验证,即使没有运筹学背景也能快速上手。文章还提供了部署与优化智能体的实用技巧,帮助读者在物流配送、机器人导航等领域应用这一技术。

weixin_28256233的博客 488

保存位图位图保存时上下颠倒?

文章结束给大家来个程序员笑话:[M]     位图取读时,一般都是 for(GLint j=0; j&lt; pThis-&gt;m_nHeight-1; j++) { for(GLint k=0; k&lt; pThis-&gt;m_nWidth-1; k++) { pixels[i][j]= pf[m_nWidth...

weixin_33694620的博客 573

NLP实践——利用自己的语料进行Mask Language Model预训练

#!/usr/bin/env python # coding: utf-8 # In[1]: import os import json import copy from tqdm.notebook import tqdm import torch from torch.optim import AdamW from torch.utils.data import DataLoader, Dataset from transformers import BertForMaskedLM, BertTo

weixin_44826203的博客 1万+

threejs中使用Reflector实现出倒影效果,并实现背景透明的效果(Reflector镜面背景透明, 倒影弱化)

在项目中遇到要实现倒影效果,threejs给我们提供了Reflector,可以轻松完成镜面效果,实现倒影。但背景不透明;并且反射出的倒影太亮了;网上没搜到解决方案, 自己修改了下源码实现了想要的效果,做个记录...

weixin_40856652的博客 5723

怎么把指定dc的指定区域保存成HBITMAP,以及怎么把HBITMAP保存成位图

HBITMAP CopyDCToBitmap(HDC hScrDC, LPRECT lpRect){if(hScrDC==NULL || lpRect==NULL || IsRectEmpty(lpRect))  {   AfxMessageBox("参数错误");return NULL;} HDC        hMemDC;       // 屏幕和内存设备描述表 HB

bobob的专栏 1万+

Python爬虫实战:携程旅游攻略爬取全流程解析(动态接口+反爬破解+异步爬取)

本文介绍了携程旅游攻略的爬取全流程,涵盖静态和动态页面抓取、异步请求、高级反爬策略以及数据存储和简单分析。增加用户评论和评分抓取结合NLP分析攻略文本情感与关键词建立旅游推荐系统自动化代理IP池和验证码识别模块。

2201_76125261的博客 2039

VC++兼容DC 和兼容位图保存位图资源

上班活不是很多,完了我手机的拼图游戏,突然想自己写一个自己的拼图游戏。       在动手之后,在位图导入之后只要保存有用的位图信息,不想全部保存,于是我想到了用兼容DC来保存于是我写了如下代码 CPicture::CPicture(const HDC& hdc):m_x(0), m_y(0),m_width(0), m_height(0),m_curIndex(0) {    m_bit

jiejieaiai的专栏 844

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

保存位图为文件

//////////////////////////////////// //保存位图文件 //////////////////////////////////// bool Write2Bitmap(BYTE *pData,CString filename,int width,int height,int bitcount) { FILE *fe;  int i;  int inde

hnwha的专栏 1044

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: GDI+入门
下一篇: 关键字static
火VVVVV
博客等级 码龄16年 87粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值