现在的位置: 首页 > 综合 > 正文

依赖设备的位图和 dib 之间转换

2012年08月16日 ⁄ 综合 ⁄ 共 2116字 ⁄ 字号 评论关闭

若要将一个 DDB 转换为 DIB 使用以下步骤:

  1. 初始化 BITMAPINFOHEADER
    数据结构。
    1. 设置为 sizeof(BITMAPINFOHEADER) biSize。
    2. 将 biWidth 设置为位图的宽度。
    3. 将 biHeight 设置为位图的高度。
    4. 将 biPlanes 设置为 1。
    5. 设置为乘以 bmBitsPixel 的位图 bmPlanes biBitCount。此值可以包含仅在值 1、 4、 8,或 24。
    6. 将 biCompression 设置为所需的格式 (通常 BI_RGB)。
    7. 可以将所有其他字段设置为零。

    初始化 BITMAPINFOHEADER
    数据结构的代码可能如下所示:

       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;
  2. 如果逻辑调色板与位图关联到所需的设备上下文使用 SelectObject()
    ,选择调色板,然后实现与 RealizePalette()
    调色板。
  3. 分配一个内存块的大小足以存储该 DIB BITMAPINFOHEADER
    结构和颜色表。颜色表是一个包含图像所使用的颜色的 RGBQUAD
    结构数组。颜色表的大小是乘以 sizeof(RGBQUAD) 的颜色数。使用 biBitCount
    字段 BITMAPINFOHEADER,指定颜色分辨率 (每个像素的位) 中找到的颜色数。例如对于每个像素 1 位意味着单色 (两色) 每像素 4 位表示 16 色和每像素 8 位表示 256 色。为一个 24 位颜色图像但是,没有颜色表。
  4. 调用 GetDIBits()
    函数与所需的设备上下文 (DC) 作为 lpBitsInfo,将内存块的指针,并作为 lpBits 参数为 NULL。这样将指示设备驱动程序以填充 biSizeImage
    BITMAPINFOHEADER
    结构 (该字段应该都已初始化为 0,第 1 步中) 的字段中。biSizeImage
    字段指定 (以字节为单位) 存储组成该 DIB 的图像位所需的内存量。如果此字段后调用 GetDIBits()
    仍然 0,应用程序必须计算 biSizeImage 使用以下公式:

    ((((biWidth * biBitCount) + 31) & ~31) >> 3) * biHeight

    此公式是必需的因为图像的每个扫描线对齐在双字节边界上。

  5. 重新分配内存块包含提供更多的内存来存储该 DIB 的位 BITMAPINFOHEADER
    和颜色表。
  6. 作为 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,请执行下列操作:

  1. 创建逻辑调色板与 DIB 颜色表中的信息。完成使用的颜色值颜色表中找到,则调用 CreatePalette()
    LOGPALETTE
    数据结构。
  2. 选择逻辑调色板到所需的设备上下文使用 SelectObject()
    ,然后实现使用 RealizePalette()
    调色板。
  3. 调用 CreateDIBitmap()
    使用所需的 DC 和指向该 DIB 指针作为 lpInfoHeader 参数。此函数返回一个 DDB 句柄。

在上面的 SHOWDIB DIB.C 文件中 BitmapFromDib()
函数、 DIBToBitmap()
函数的 WINCAP,DIBUTIL.C 文件中和 DIBToBitmap()
函数在 DIB.C 中的列出的示例应用程序中的 DIBVIEW 文件说明上述过程。

抱歉!评论已关闭.