若要将一个 DDB 转换为 DIB 使用以下步骤:
- 初始化 BITMAPINFOHEADER 数据结构。
- 设置为 sizeof(BITMAPINFOHEADER) biSize。
- 将 biWidth 设置为位图的宽度。
- 将 biHeight 设置为位图的高度。
- 将 biPlanes 设置为 1。
- 设置为乘以 bmBitsPixel 的位图 bmPlanes biBitCount。此值可以包含仅在值 1、 4、 8,或 24。
- 将 biCompression 设置为所需的格式 (通常 BI_RGB)。
- 可以将所有其他字段设置为零。
BITMAPINFOHEADER bmi;
BITMAP bm;
.
.
.
bmi.biSize = sizeof(BITMAPINFOHEADER);
bmi.biWidth = bm.bmWidth;
bmi.biHeight = bm.bmHeight;
bmi.biPlanes = 1;
bmi.biBitCount = bm.bmPlanes * bm.bmBitsPixel;
if (bmi.biBitCount <= 1)
bmi.biBitCount = 1;
else if (bmi.biBitCount <= 4)
bmi.biBitCount = 4;
else if (bmi.biBitCount <= 8)
bmi.biBitCount = 8;
else
bmi.biBitCount = 24;
bmi.biCompression = BI_RGB;
bmi.biSizeImage = 0;
bmi.biXPelsPerMeter = 0;
bmi.biYPelsPerMeter = 0;
bmi.biClrUsed = 0;
bmi.biClrImportant = 0;
- 如果逻辑调色板与位图关联到所需的设备上下文使用 SelectObject() ,选择调色板,然后实现与 RealizePalette() 调色板。
- 分配一个内存块的大小足以存储该 DIB BITMAPINFOHEADER 结构和颜色表。颜色表是一个包含图像所使用的颜色的 RGBQUAD 结构数组。颜色表的大小是乘以 sizeof(RGBQUAD) 的颜色数。使用 biBitCount 字段 BITMAPINFOHEADER,指定颜色分辨率 (每个像素的位) 中找到的颜色数。例如对于每个像素 1 位意味着单色 (两色) 每像素 4 位表示 16 色和每像素 8 位表示 256 色。为一个 24 位颜色图像但是,没有颜色表。
- 调用 GetDIBits() 函数与所需的设备上下文 (DC) 作为 lpBitsInfo,将内存块的指针,并作为 lpBits 参数为 NULL。这样将指示设备驱动程序以填充 biSizeImage BITMAPINFOHEADER 结构 (该字段应该都已初始化为 0,第 1 步中) 的字段中。biSizeImage 字段指定 (以字节为单位) 存储组成该 DIB 的图像位所需的内存量。如果此字段后调用 GetDIBits() 仍然 0,应用程序必须计算 biSizeImage 使用以下公式:
((((biWidth * biBitCount) + 31) & ~31) >> 3) * biHeight
- 重新分配内存块包含提供更多的内存来存储该 DIB 的位 BITMAPINFOHEADER 和颜色表。
- 作为 lpBits,位图位和作为 DIB_RGB_COLORS wUsage 调用 GetDIBits() 与所需的 DC,作为 lpBitsInfo 将内存块的指针,指向缓冲区的指针。这将存储与 BITMAPINFOHEADER 结构 DIB 的位,并完成颜色表。
在上面的 SHOWDIB DIB.C 文件中 DibFromBitmap() 函数、 BitmapToDIB() 函数的 WINCAP,DIBUTIL.C 文件中和 BitmapToDIB() 函数在 DIB.C 中的列出的示例应用程序中的 DIBVIEW 文件说明上述过程。
注 : 的前两个示例将位图转换为 Windows 3.0 样式 dib 和不支持 OS/2 类型 dib。DIBVIEW 支持 OS/2 类型 dib。
有关 Windows 3.0 样式 DIB 格式的详细信息,请参阅"microsoft Windows 软件开发工具包参考卷 2"版本 3.0 手动和 $ Windows 3.1 SDK 中"程序员参考卷 3 中的 BITMAPINFO 、 BITMAPINFOHEADER 和 RGBQUAD 结构的文档: 邮件、 结构,和宏的"手动。
若要将 DIB 转换为一个 DDB,请执行下列操作:
- 创建逻辑调色板与 DIB 颜色表中的信息。完成使用的颜色值颜色表中找到,则调用 CreatePalette() LOGPALETTE 数据结构。
- 选择逻辑调色板到所需的设备上下文使用 SelectObject() ,然后实现使用 RealizePalette() 调色板。
- 调用 CreateDIBitmap() 使用所需的 DC 和指向该 DIB 指针作为 lpInfoHeader 参数。此函数返回一个 DDB 句柄。
在上面的 SHOWDIB DIB.C 文件中 BitmapFromDib() 函数、 DIBToBitmap() 函数的 WINCAP,DIBUTIL.C 文件中和 DIBToBitmap() 函数在 DIB.C 中的列出的示例应用程序中的 DIBVIEW 文件说明上述过程。
原文链接:https://www.f2er.com/javaschema/287597.html