CreateDIBSection

流过昼夜 提交于 2020-04-04 04:21:09

  函数功能:该函数创建应用程序可以直接写入的、与设备无关的位图(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。

一般生成DIB
hSection = NULL
DwOffset = 0

调用形式: 这是我在使用的DIB类中生成DIB的原始代码

BITMAPINFO BITMAPINFO;
BITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
BITMAPINFO.bmiHeader.biWidth = m_MyWidth;
BITMAPINFO.bmiHeader.biHeight = m_MyHeight;
BITMAPINFO.bmiHeader.biPlanes = 1;
BITMAPINFO.bmiHeader.biBitCount = iBitCount;
BITMAPINFO.bmiHeader.biCompression = BI_RGB;
BITMAPINFO.bmiHeader.biXPelsPerMeter = 0;
BITMAPINFO.bmiHeader.biYPelsPerMeter = 0;
BITMAPINFO.bmiHeader.biClrUsed = 0;
BITMAPINFO.bmiHeader.biClrImportant = 0;
BITMAPINFO.bmiHeader.biSizeImage = 0;

HBITMAP m_Myhbitmap;
byte m_MyBuffer;
if ((m_Myhbitmap = CreateDIBSection(NULL, &BITMAPINFO, DIB_RGB_COLORS, (void **)&m_MyBuffer, NULL, 0)) == NULL)
{
DeleteDC(m_Myhdc);//未成功执行
m_Myhdc = NULL;
m_MyWidth = 0;
m_MyHeight = 0;
return false;
}
else
{ //成功执行
m_MyhbitmapOld = (HBITMAP)SelectObject(m_Myhdc, m_Myhbitmap);
m_MyptrByte = m_MyBuffer;
const int dpixeladd = iBitCount / 8;
m_MyPixelAdd = dpixeladd - 3;
m_MyLineByteWidth = m_MyWidth * (dpixeladd);
if ((m_MyLineByteWidth % 4) != 0)
m_MyLineByteWidth += 4 - (m_MyLineByteWidth % 4);
m_MyCreated = true;
return true;
}

BITMAPINFO.bmiHeader.biWidth = m_MyWidth; //位图宽度
BITMAPINFO.bmiHeader.biHeight = m_MyHeight; //位图高度
BITMAPINFO.bmiHeader.biBitCount = iBitCount; //位图颜色位数

成功执行 m_Myhbitmap中是位图句柄 HBITMAP
成功执行 m_MyBuffer中是位图位数据的首地址

CreateDIBSection的最主要功能就是由此可获取Buffer指针,直接读写位图数据,而不必通过API调用,效率极高

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!