CBitmap位图操作大集合

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
   显示位图
 
 在Visual C++6.0中,显示位图的方法及过程如下:
  1. 显示程序资源中的位图(位图的所有数据均存在于可执行文件中)
  (1)从资源中装入位图
  定义位图对象数据成员CBitmap m_Bitmap;
  调用CBitmap成员函数LoadBitmap(),如m_Bitmap.LoadBitmap(IDB_BITMAP1);
  传入LoadBitmap的参数是位图在图形编辑器中生成或从位图文件中引入时赋予的识别符。
  (2)生成与位图相联系的内存设备情境对象
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
MemDC.SelectObject(&m_Bitmap);
  (3)显示位图
CClientDC ClientDC(this);
BITMAP BM;
m_Bitmap.GetObject(sizeof(BM)
&BM);
ClientDC.BitBlt
( X
Y, //目标设备逻辑横、纵坐标
BM.bmWidth, BM.bmHeight, //
显示位图的像素宽、高度
&MemDC,
//
待显示位图数据的设备情境对象
0
0, //源数据中的横、纵坐标
SRCCOPY); //
位操作方式
  这种方法显示位图速度快,但不是很灵活,而且会使可执行文件增大。
  2. 显示独立文件方式的位图(位图的所有数据独立于可执行文件)
HBITMAP *hBitmap; //定义位图对象句柄
BITMAP BM;
CDC MemDC;
CClientDC ClientDC(this);
MemDC.CreateCompatibleDC(&ClientDC);
hBitmap=(HBITMAP*):: LoadImage
( AfxGetInstanceHandle(),
//
取得应用程序句柄
“demo1.bmp”,
//
位图文件名
IMAGE_BITMAP,
//
类型为Windows位图
0
0,
LR_LOADFROMFILE);
//
从文件中取位图数据
MemDC.SelectObject(hBitmap);
:: GetObject(hBitmap
sizeof(BM)&BM);
ClientDC.BitBlt(……)
//
使用格式与方法一同
  这种方法显示位图速度较之前一种慢了一点,但其灵活性较大,可以任意变换位图文件,而无需重新编译源程序, 也减小了可执行文件的大小。
实现方法
  下面介绍各种图形显示技巧的具体实现原理及方法。以下所有程序算法的实现均可放在视类(CView,也可视自己的需要放在其他类)中处理,且有必要进行如下的相关操作:
  增加如下类成员变量:
BITMAP m_Bm;
//保存位图的宽、高度等数据
HBITMAP *m_hBitmap;
//保存位图数据句柄
CDC m_MemDC; //内存设备情境对象
  在类构造函数中加入如下代码:
m_MemDC.CreateCompatibleDC(NULL); //产生内存设备情境对象
m_hBitmap=(HBITMAP *)::LoadImage(
//从文件中装入位图数据
AfxGetInstanceHandle(),
“demo1.bmp”,
IMAGE_BITMAP,
0,0,
LR_LOADFROMFILE );
m_MemDC.SelectObject(m_hBitmap); //将位图选入内存设备情境对象
::GetObject(m_hBitmap,sizeof(m_Bm),&m_Bm);
 
 
保存位图
 
 
       CString m_Path("C://");
 
       int       nX, nY, nX2, nY2;     
       // 选定区域坐标
       int       Width, Height;
      
       // 确保选定区域不为空矩形
       if (IsRectEmpty(lpRect))
              return NULL;
 
 
       // 获得选定区域坐标
       nX = lpRect->left;
       nY = lpRect->top;
       nX2 = lpRect->right;
       nY2 = lpRect->bottom;
 
       //确保选定区域是可见的
       if (nX < 0)
              nX = 0;
       if (nY < 0)
              nY = 0;
       if (nX2 > m_xScreen)
              nX2 = m_xScreen;
       if (nY2 > m_yScreen)
              nY2 = m_yScreen;
       Width = nX2 - nX;
       Height = nY2 - nY;
 
 
 
    CDC dc;
       dc.CreateDC("DISPLAY",NULL,NULL,NULL);
       CBitmap bm;
 
 
 
       bm.CreateCompatibleBitmap(&dc,Width,Height);
       CDC tdc;
       tdc.CreateCompatibleDC(&dc);
       CBitmap*pOld=tdc.SelectObject(&bm);
       tdc.BitBlt(0,0,Width,Height,&dc,nX,nY,SRCCOPY);
 
       tdc.SelectObject(pOld);
       BITMAP btm;
       bm.GetBitmap(&btm);
      
       DWORD size=btm.bmWidthBytes*btm.bmHeight;
       LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
/////////////////////////////////////////////
       BITMAPINFOHEADER bih;
       bih.biBitCount=btm.bmBitsPixel;
       bih.biClrImportant=0;
       bih.biClrUsed=0;
       bih.biCompression=0;
       bih.biHeight=btm.bmHeight;
       bih.biPlanes=1;
       bih.biSize=sizeof(BITMAPINFOHEADER);
       bih.biSizeImage=size;
       bih.biWidth=btm.bmWidth;
       bih.biXPelsPerMeter=0;
       bih.biYPelsPerMeter=0;
///////////////////////////////////
       GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
//     bm.GetBitmapBits(size,lpData);     //此函数在处理5-5-5模式的16位色下会出现颜色混乱
//////////////////////////////
       static int filecount=0;
       CString name;
       name.Format("pict%04d.bmp",filecount++);
       name=m_Path+name;
              MessageBox(name);
       BITMAPFILEHEADER bfh;
       bfh.bfReserved1=bfh.bfReserved2=0;
       bfh.bfType=((WORD)('M'<< 8)|'B');
       bfh.bfSize=54+size;
       bfh.bfOffBits=54;
       CFile bf;
       if(bf.Open(name,CFile::modeCreate|CFile::modeWrite)){
              bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
              bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
              bf.WriteHuge(lpData,size);
              bf.Close();
      
       }
       GlobalFreePtr(lpData);
 
 
32位位图到24位位图的转换
 
(一)功能
在图像处理的很多实际应用中,我们需要对图像的颜色表示进行转换(如,将32位颜色转换到24位颜色等等)。本文通过一个简单的例子,说明了32位颜色到24位颜色的转换过程。程序假设当前windows桌面颜色为32位颜色值。
 
(一)功能
在图像处理的很多实际应用中,我们需要对图像的颜色表示进行转换(如,将32位颜色转换到24位颜色等等)。本文通过一个简单的例子,说明了32位颜色到24位颜色的转换过程。程序假设当前windows桌面颜色为32位颜色值。
(二)准备工作
建立VC CONSOLE APPLICATION,选择MFC SUPPORT
 
(三)主函数
函数Bmp32ToBmp24将32位位图转换到24位位图格式。
注意:该函数假设当前windows桌面颜色为32位颜色值。
 
// transform 32-bit bitmap format to 24-bit bitmap format
void Bmp32ToBmp24(char Filename[])
{
 char Filename2[] = "output.bmp";
 
 //注意:如果没有LR_CREATEDIBSECTION,位图颜色将被映射到屏幕DC颜色
 //也就是说,如果屏幕是16位颜色,则所有的图像都将映射到16位颜色
 HBITMAP hbmp32 = (HBITMAP) LoadImage(NULL, Filename,
 IMAGE_BITMAP, 0, 0,
 LR_LOADFROMFILE |
 LR_CREATEDIBSECTION);
 
 BITMAP bmp;//获取位图信息
 GetObject(hbmp32, sizeof(BITMAP), &bmp);
 
 printf("Image Bit Depth : %d/nWidth : %d , Height : %d /n",
 bmp.bmBitsPixel, bmp.bmWidth, bmp.bmHeight);//显示位图颜色模式和图像宽高
 
 //计算24位图像每行的字节数
 int BytesPerLine = 3 * bmp.bmWidth;
 while(BytesPerLine % 4 != 0)
 BytesPerLine ++;
 
 BITMAPINFOHEADER bih = {0};//位图信息头
 bih.biBitCount = 24;//每个像素字节大小
 bih.biCompression = BI_RGB;
 bih.biHeight = bmp.bmHeight;//高度
 bih.biPlanes = 1;
 bih.biSize = sizeof(BITMAPINFOHEADER);
 bih.biSizeImage = BytesPerLine * bmp.bmHeight;//图像数据大小
 bih.biWidth = bmp.bmWidth;//宽度
 
 BITMAPFILEHEADER bfh = {0};//位图文件头
 bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
 bfh.bfSize = bfh.bfOffBits + bih.biSizeImage;//文件总的大小
 bfh.bfType = (WORD)0x4d42;
 
 FILE *fp = fopen(Filename2, "w+b");
 
 fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);//写入位图文件头
 
 fwrite(&bih, 1, sizeof(BITMAPINFOHEADER), fp);//写入位图信息头
 
 byte * p = new byte[bih.biSizeImage];
 
 //获取当前32位图像数据
 GetDIBits(GetDC(NULL), hbmp32, 0, bmp.bmHeight, p, (LPBITMAPINFO)&bih, DIB_RGB_COLORS);
 
 //只取rgb值,存入文件
 byte b = 0;//用于填充
 for(int i = 0 ; i < bmp.bmWidth * bmp.bmHeight ; i ++)
 {
 //32位位图图像的格式为:Blue, Green, Red, Alpha
 fwrite(&(p[i * 3]), 1, 3, fp);
 if(i % bmp.bmWidth == bmp.bmWidth - 1)//填充字节
 {
   for(int k = 0 ; k < (BytesPerLine - bmp.bmWidth * 3) ; k ++)
    fwrite(&b, sizeof(byte), 1, fp);
 }
 }
 
 delete [] p;
 
 fclose(fp);
 
 DeleteObject(hbmp32);
}
15. C语言实现位图 bitmap 1. 位图是什么? 位图是一种资源管理的方式,按位bit与资源一对一的对应关系。 位图中的每一位将于内存中的每一页一一对应。 一个位有 2 种状态,即 0 和 1 ,用位图中的每一个位来表示实际物理内存的 4KB(一页) 。 如果某位为 0 ,表示该位对应的页未分配。 反之,某位为 1 ,表示该位对应的页已分配。 2. 实现位图 实现位图,用到两个文件,bitmap.c 和 bitmap.h。 b... 阅读详情

相关推荐

VC++使用画刷绘图 简单画刷 FillRect函数 位图画刷 透明画刷

目录 使用画刷绘图 简单画刷 FillRect函数 位图画刷 透明画刷 接上:VC++ 利用MFC的CWindowDC类实现画线功能 在桌面窗口中画线 绘制彩色线条 CPen nPenStyle nWidth crColor 接下: 使用画刷绘图 MFC提供了一个CBrush类,可以用来创建画刷对象。画刷通常用来填充一块区域。 简单画刷 如下所示代码实现的功能是利用一个红色画刷填充鼠标拖曳过程中形成的一块矩形区域。 void CDrawView::OnLButtonUp(UINT

当路danglu0010 4318

vc CBitmapLoadBitmap_LoadImage加载位图文件

vc CBitmapLoadBitmap_LoadImage加载.bmp文件

CBitmap位图操作全面指南

CBitmap是一个用于在 MFC(Microsoft Foundation Classes)框架中处理位图的类。它提供了一套丰富的接口,用于创建、加载、保存位图,以及将位图与设备环境(Device Context,DC)关联,实现位图的各种显示与处理操作CBitmap是管理位图资源的重要工具,适用于从简单的图形显示到复杂的图像处理。颜色模型是一种用数学方法来确定和表示颜色的系统。它为颜色的定义和交流提供了一种标准方式。常用的颜色模型包括RGB模型、CMYK模型和HSL模型。RGB模型。

weixin_29781865的博客 1068

关于CBitmap的使用

在初始化CBitmap对象时,常用Cbitmap::LoadBitmap,即如下两种:  BOOL   LoadBitmap(   LPCTSTR   lpszRecourceName   );     BOOL   LoadBitmap(   UINT   nIDResource   );     MSDN中的说明为:" 返回值调用成功时返回非零值,否则为0。     lpszRes

include1224的专栏 1万+

CBitmap::LoadBitmap问题

BOOL LoadBitmap(LPCTSTR lpszResourceName) BOOL LoadBitmap(UNIT nIDResource) 通过指定资源名称或者资源ID加载指定位图。但指定的资源要是程序导入的资源,不能直接以位图的路径和名字为参数。CBitmap::LoadBitmap()不能以文件形式打开,原因不知道,虽然提供了LPCTSTR lpszResourceName(主持人注:这个参数是DLL或EXE中的资源名,不是文件名),给出了另外的方法,也是常用的。请看下面的代码: 

囧小平-云栖隐者 5241

CBitmap位图操作

 CBitmap位图操作显示位图  在Visual C++6.0中,显示位图的方法及过程如下:   1. 显示程序资源中的位图(位图的所有数据均存在于可执行文件中)   (1)从资源中装入位图  ● 定义位图对象数据成员CBitmap m_Bitmap;   ● 调用CBitmap成员函数LoadBitmap(),如m_Bitmap.LoadBitmap(IDB_BITMAP1);   ●

bitxinhai的专栏 7453

【MFC】位图CBitmap、BITMAP、HBITMAP之间的转换

【MFC】位图CBitmap、BITMAP、HBITMAP之间的转换 一:理解 BITMAP是C++中定义的位图结构体 HBITMAP是Windows中使用的位图句柄 CBitmap是MFC封装的位图类 二:相互转换 1、HBITMAP->CBitmap  方法一: HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP,

UniverseLin的博客 3018

CBitmap

CBitmapCObject └CGdiObject    └CBitmap CBitmap是MFC中的类。类CBitmap封装了Windows图形设备接口(GDI)中的位图,并且提供了操纵位图的成员函数。使用CBitmap对象之前要先构造CBitmap对象,调用其中的一个初始化成员函数设置位图对象的句柄。此后就可以调用其它成员函数了。#in

7154

C++-MFC(11)-HBITMAP,CBITMAP,BITMAP 基本定义与使用

在MFC中,如果要操作位图,必然会用到HBITMAP,CBITMAP,BITMAP。 首先区分概念:BITMAP是C++中定义的位图结构体。 HBITMAP是Windows中使用的位图句柄。 CBitmap是MFC封装的位图类。1.定义与使用 1.1HBITMAP指针 从文件中录入指针,得到文件句柄 1.2 CBITMAP类只能下载工程中的位图资源 1.3BITMAP 结构体,得到位图中的 2.类型之间的互相转换 1.定义与使用 1.1HBITMAP指针...

aggie4628的专栏 3816

【MFC编程(六)】图形图像:位图CBitmap和OnPaint函数

BITMAP是C++中定义的位图结构体,封装着bitmap的一些信息,定义了逻辑位图的高、宽、颜色格式以及位值。

qq_39281631的博客 1520

CBitmap位图

CBitmap封装了Windows图形设备接口(GDI)中的位图,并且提供了操纵位图的成员函数。使用CBitmap对象之前要先初始化CBitmap对象。 构造函数 CBitmap 构造一个CBitmap对象 初始化函数 LoadBitmap 从应用的可执行文件中加载一个命名的位图资源来初始化位图对象 LoadOEMBitmap 加

milanleon的专栏 2189

CBitMap的用法

CBitMap的用法 MFC提供了位图处理的基础类CBitmap,可以完成位图(bmp图像)的创建、图像数据的获取等功能。虽然功能比较少,但是在对位图进行一些简单的处理时,CBitmap类还是可以胜任的。很多人可能会采用一些现成的CDib类进行位图的读取与处理,我觉得必要性不。因为他们完成的功能差不多。 以下假设定义了数据成员: CBitmap m_bitmap; (1) 位图的读取 void LoadImage(CString fileName) { HBITMAP m_hBitmap;//位图句柄

weixin_45699553的博客 1859

《工作笔记》 mfc 利用HBITMAP 和CBITMAP 显示位图文件

显示位图文件有n中方法:1 利用双缓冲技术;源码:void showBMP(){CString   str;      CString   filter="Bitmap    Files(*.bmp)|*.bmp|Wmf   Files(*.wmf)|*.wmf||";   CFileDialog   dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OF

uniquechao的专栏 2048

BITMAP是C++中定义的位图结构体 HBITMAP是Windows中使用的位图句柄 CBitmap是MFC封装的位图

一:理解 BITMAP是C++中定义的位图结构体 HBITMAP是Windows中使用的位图句柄 CBitmap是MFC封装的位图类 二:相互转换 1、HBITMAP->CBitmap  方法一: HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); C...

BlueMan 1063

MFC CBitmap Class

CBitmap 类Base Class Members(基类成员)Construction(构造)Initialization(初始化)Attributes(属性)Operations(操作)心得体会 To use a CBitmap object, construct the object, attach a bitmap handle to it with one of the initialization member functions, and then call the object’s mem

sty_app的博客 368

关于HBITMAP,CBITMAP,BITMAP的转换以及图像显示的一点归纳

OK,在上一篇文章中我提到了VC6和VS的差别,在VC6中我们只能依赖于CBITMAP HBITMAP以及BITMAP之间的转化关系,而在VS中,我们用CIMAGE类就可以全部搞定,那么究竟这三个类之间的转化关系是什么样的呢?图像显示的时候该怎么使用呢,别着急,听我慢慢道来。 一、区分概念:首先: BITMAP是C++中定义的位图结构体 HBITMAP是Windows中使用的位图句柄 CB...

u011555996的博客 2118

详细介绍MFC中的CBitmap

CBitmap是 MFC 封装的 GDI(图形设备接口)位图类,继承自CGdiObject,用于加载、操作和显示位图图像。​​位图资源管理​加载应用程序内嵌位图或外部文件。​​设备上下文操作​​:与CDC配合实现位图绘制、缩放和裁剪。​​内存位图创建​​:动态生成位图数据,支持自定义图像处理CBitmap是 MFC 中处理位图的核心类,支持从资源加载、动态创建到复杂图像处理的全流程操作。​​灵活性​​:支持多种初始化方式和图像操作(缩放、裁剪、透明化)。​​兼容性​​:与CDC。

felicity_one的博客 1186

MFC CBitmap::CreateBitmap()

CBitmap::CreateBitmapSyntaxParametersReturn ValueRemarks心得体会 Initializes a device-dependent memory bitmap that has the specified width, height, and bit pattern. 【初始化具有指定宽度、高度和位模式的设备相关内存位图。】 回到 CBitmap Class Syntax BOOL CreateBitmap( int nWidth, int n

sty_app的博客 1591
上一篇: CMarkup概述
下一篇: 2007年10月31日,我来到了厦门
chuan014
博客等级 码龄20年 47粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值