您的位置:首页 > 其它

CreateDIBSection 是怎么使用内存的?

2013-08-14 23:31 831 查看
CreateDIBSection 该函数创建应用程序可以直接写入的、与设备无关的位图(DIB)。

m_hbitmap = CreateDIBSection(m_hdc, &m_bmi, DIB_RGB_COLORS, &m_pimagedata, NULL, 0x0);使用这个函数前,要先建立兼容的内存设备上下文m_hdc,准备好位图信息BITMAPINFO m_bmi;

m_hdc = CreateCompatibleDC(pDC->m_hDC);



m_bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

m_bmi.bmiHeader.biWidth =m_ZoomSize.x;

m_bmi.bmiHeader.biHeight = m_ZoomSize.y;

m_bmi.bmiHeader.biPlanes = 1;

m_bmi.bmiHeader.biBitCount =32; // four 8-bit components

m_bmi.bmiHeader.biCompression = BI_RGB;

m_bmi.bmiHeader.biSizeImage =m_ZoomSize.x*m_ZoomSize.x*4 ;

m_hbitmap = CreateDIBSection(m_hdc, &m_bmi, DIB_RGB_COLORS, &m_pimagedata, NULL, 0x0);

它怎么使用内存呢? 这个函数会在m_hdc内存块上将void * m_pImageData指向一块信息头后面的区域,指定为数据区。事实上还没分配内存空间,指针后面的m_ZoomSize.x*m_ZoomSize.x*4大小的空间并没有为数据预留,在真正赋值的时候才会占用空间。

那么怎么释放这些空间呢?不是自己分配的就不用自己释放,系统在释放m_hdc这个内存设备上下文的时候就会释放了。但是要记得在适当的地方用DeleteDC(m_hdc)释放掉m_hdc哦。

如果m_hbitmap被selectobject,记住要先将其换出,DeleteDC(m_hdc)才能把那块数据区域收回哦! SelectObject(m_hdc, m_hbitmap);



m_MemDC.SelectObject(pOldBitmap);//将内存中的图像换出
mBitmap.DeleteObject();//将新换入的对象删除(通过释放附加的GDI对象占有的系统存储来删除它们)
m_MemDC.DeleteDC();

这里m_hdc = CreateCompatibleDC(pDC->m_hDC);pDC是CDC类型指针,CDC类定义的是设备上下文对象的类(设备的总称),它的对象可以处理显示器、打印机等设备上下文的成员函数,也可以处理与窗口客户区对应的显示上下文的成员。m_hdc是与它兼容的设备上下文内存。

下面这些是CreateDIBSection函数的介绍。来自百度百科,贴过来方便大家阅读和理解。


简介

函数功能:该函数创建应用程序可以直接写入的、与设备无关的位图(DIB)。该函数提供一个指针,该指针指向位图位数据值的地方。可以给文件映射对象提供句柄,函数使用文件映射对象来创建位图,或者让系统为位图分配内存。

函数原型:HBITMAP CreateDIBSection(HDC hdc,CONST BITMAPINFO *pbmi,UINT iUsage,VOID** ppvBits,HANDLE hSection,DWORD dwOffset);

参数:

hdc:设备环境句柄。如果iUsage的值是DIB_PAL_COLORS,那么函数使用该设备环境的逻辑调色板对与设备无关位图的颜色进行初始化。

pbmi:指向BITMAPINFO结构的指针,该结构指定了与设备无关位图的各种属性,其中包括位图的维数和颜色。

iUsage:指定由pbmi参数指定的BITMAPINFO结构中的成员bmiColors数组包含的数据类型(要么是逻辑调色板索引值,要么是原文的RGB值)。下列值是系统定义的,其含义为:

DIB_PAL_COLORS:表示成员bmiColors是hdc指定的设备环境的逻辑调色板,使用的是16位索引值数组

DIB_RGB_COLORS:表示结构BITMAPINFO中包含了RGB值的数组。

ppvBits:指向一个变量的指针,该变量接收一个指向DIB位数据值的指针。

hSection:文件映射对象的句柄。函数将使用该对象来创建DIB(与设备无关位图)。该参数可以是NULL。

如果hSection不是NULL,那么它一定是文件映射对象的句柄。该对象是通过调用带有PAGE_READWRITE或PAGE_WRITECOPY标志的CreateFileMapping函数创建的。不支持只读的DIB类型。通过其他方法创建的句柄将会引起CreateDIBSection函数执行失败。

如果hSection不是NULL,那么函数CreateDIBSection将在hSection引用的文件映射对象中偏移量为dwOffset处获取位图的位数据值。应用程序可以在以后通过调用GetObject函数来检索hSection句柄,其中GetObject函数使用了GreateDIBSection函数返回的GBITMAP类型的对象。

如果hSection为NULL,那么系统将为与设备无关位图(DIB)分配内存。在这种情况下,函数CreateDIBSection将忽略参数dwOffset,应用程序无法在以后获取指向内存的句柄。通过调用GetObject函数来填充的DIBSECTION结构成员dshSection也将成为NULL。

DwOffset:指定从hSection引用的文件映射对象开始处算起的偏移量,超过这个偏移量的地方就是位图的位数据值开始存放的地方。在hSection为NULL时忽略该值。位图的位数据值是以DWORD为单位计算的。

返回值:如果函数执行成功,那么返回值是一个指向刚刚创建的与设备无关位图的句柄,并且*ppvBits指向该位图的位数据值;如果函数执行失败,那么返回值为NULL,并且*ppvBit也为NULL,若想获得更多错误信息,请调用GetLastError函数。


编辑本段备注

正如上面提到过,如果hSection为NULL,那么系统为DIB分配内存。当以后通过调用DeleteObject函数删除该DIB时,系统将关闭指向相应内存的句柄。如果Hsection不为NULL,那么在调用DeleteObject删除该位图之后,必须自己关闭hSection内存句柄。

Windows NT:需要保证GDI子系统在自己绘制位图之前已经完成所有由创建的位图。访问位图应该是同时的。这可以调用函数来进行。其适用于任何指向位图的位数据值指针的情况,也包括在调用象这样的函数时传送指针的情形。

:如果(由参数指向)结构成员不包含或,那么不进行颜色管理。否则,允许有颜色管理,并且有与该位图有关的特定的颜色空间。

:参数要设为。除非使用的是位图。在这种情况下,应设为。然而,如果使用了,操作系统将忽略结构成员数组中的值。另外,应将参数设为,忽略参数,可将它设为0。

在版中,由参数指向的结构必定规定每像素点为1或2位。

在版中,如果图像是调色板模式(通常是1,2,4和8格式)的,那么结构中必须包括颜色表。对于或非调色板式的图像,颜色表必须是项长度,这项必须指定红、绿和蓝3色的位掩码值。对于图像,将忽略颜色表,其像素必须按(BGR)格式存储。

速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:wingdi.h;库文件:gdi32.lib。

VC++ 代码实例:

_compDC=CreateCompatibleDC(hDC);

setbih(iWidth, iHeight);

BITMAPINFO bi;

bi.bmiHeader=bih;

hBitmap=CreateDIBSection(hDC, &bi, DIB_RGB_COLORS, (void**)&_pbuffer, NULL, 0);

if(!hBitmap) return 0;

_OldBmp=SelectObject(_compDC, hBitmap);

BitBlt(_compDC, 0, 0, iWidth, iHeight, hDC, iLeft, iTop, SRCCOPY);

SelectObject(_compDC, _OldBmp);

DeleteDC(_compDC);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: