【问题标题】:Display 32bit bitmap - Palette显示 32 位图 - 调色板
【发布时间】:2010-11-09 05:14:11
【问题描述】:

我在 32 位扫描仪的缓冲区(类型 - 长)中有一个图像数据。

例如buffer[0]对应的像素值为952,即[184,3,0,0]

我想在屏幕上显示/绘画/绘图;当我尝试阅读有关显示位图的信息时,我感到很困惑。我查看了 win32 函数、CBitmap 类、Windows 窗体(图片框)等。我很难理解在应用程序窗口上显示此缓冲区数据的一般想法/方法。

我已经构建了 BITMAPFILEHEADER 和 BITMAPINFOHEADER;在缓冲区中有像素数据,(unsigned char *)vInBuff,大小为vImageSz;

//construct the BMP file Header
vBmfh.bfType      = 19778;
vBmfh.bfSize      = 54+vImageSz;//size of the whole image
vBmfh.bfReserved2 = 0;
vBmfh.bfReserved1 = 0;
vBmfh.bfOffBits   = 54;//offset from where the pixel data can be found
//Construct the BMP info header
vBmih.biSize        = 40;//size of header from this point
vBmih.biWidth       = 1004;
vBmih.biHeight      = 1002;
vBmih.biPlanes      = 1;
vBmih.biCompression = BI_RGB;
vBmih.biSizeImage   = vBmih.biWidth*vBmih.biHeight*4;
vBmih.biBitCount    = 32;
vBmih.biClrUsed     = 0;
vBmih.biClrUsed     = 0;

1.接下来我应该做什么来显示这个?

2 我应该使用什么来显示 32 位位图?我看到人们使用 createwindows 函数、windows 窗体、MFC 等;

3.我也知道BitBlt,createDIBSection,OnPaint等正在被使用?我对这些各种功能和编码平台感到困惑?请建议我一个简单的方法。

4.如何创建调色板来显示 32 位图像?

谢谢

Raj
已编辑 尝试实施 DAVE 的方法,有人可以评论我的实施。我无法继续使用 bitblt,因为我没有两个 HDC,我不知道如何获得这个?请帮忙

DisplayDataToImageOnScreen(unsigned char* vInBuff, int vImageSz)  // buffer with pixel data, Size of pixel data
{
unsigned char* vImageBuff = NULL;

HDC hdcMem=CreateCompatibleDC(NULL); 

HBITMAP hBitmap = CreateDIBSection(hdcMem, 
                                   (BITMAPINFO*)&vBmih, 
                                   DIB_RGB_COLORS,
                                   (void **)&vImageBuff, 
                                   NULL, 0);

GetDIBits(hdcMem,
          hBitmap,
               0,
               1,
         (void**)&vImageBuff,
         (BITMAPINFO*)&vBmih,
         DIB_RGB_COLORS);

memcpy(vImageBuff,vInBuff,vImageSz);

}

【问题讨论】:

  • Windows 需要 BGRA,而不是 RGBA,不是吗?
  • 嗨 Ubben 我的理解是像素将在内存中表示为 BGRA。
  • Windows 倾向于使用小端序,这就是它存储为 BGRA 而不是 ARGB 的原因

标签: c++ windows image bitmap


【解决方案1】:

如果您只想在屏幕上绘制它,另一种方法是使用 TinyPTC (http://sourceforge.net/projects/tinyptc/files/)。它只有 3 个函数,如果您只想绘制一些像素,则非常简单。

编辑:似乎http://www.pixeltoaster.com 是 TinyPTC 的延续,可能是首选。

【讨论】:

    【解决方案2】:

    如果缓冲区中已有图像的字节,则可以使用:

    一个 CBitmap 对象 (MFC) 和方法 CBitmap::CreateBitmapIndirect

    win32 例程CreateBitmapIndirect

    现在您可以使用 BitBltDC 上绘制它。要获得窗口 DC,请使用 GetDC

    无需为 32 位图像创建调色板。

    【讨论】:

      【解决方案3】:

      您可以尝试以下简化方法,分为几个步骤:

      BITMAPINFO bitmapinfo = { 0 };
      bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
      bitmapinfo.bmiHeader.biWidth = 1004;
      bitmapinfo.bmiHeader.biHeight = -1002;
      bitmapinfo.bmiHeader.biPlanes = 1;
      bitmapinfo.bmiHeader.biCompression = BI_RGB;
      
      HBITMAP hBitmap = CreateDIBSection(NULL, 
                                         &bitmapinfo, 
                                         DIB_RGB_COLORS,
                                         (void **)&vImageBuff,
                                         NULL,
                                         0);
      

      现在在 vImageBuff 上聚会,然后在某处缓存 hBitmap,以便在您的 wndproc 中,然后您可以在 WM_PAINT 处理程序中:

      1. 选择 hBitmap 到临时兼容 HDC 中
      2. 从兼容的 HDC 调用 BitBlt(..., SRCCOPY) 到窗口的 HDC。其他参数应该是显而易见的。一开始不要尝试拉伸或做任何花哨的事情。
      3. 记得在销毁之前将原始虚拟位图选择到临时 HDC 中。

      如果您没有看到结果,请尝试循环遍历 vImageBuff 并将每个像素设置为 RGB(255, 0, 0) 或类似的值,以检查其余逻辑。

      如果没有绘制任何内容,请确保每个像素的 alpha 分量为 255。

      如果您收到乱码图像,则需要仔细检查像素格式、步幅等。

      【讨论】:

        【解决方案4】:

        以下是您可能喜欢的策略:

        创建与扫描数据大小相同且格式相同的位图(使用 CreateDIBSection)。

        使用GetDIBits获取像素数据的基地址。

        将您的数据(从扫描仪)复制到 GetDIBits 返回的地址。

        现在渲染您的位图! (使用 BitBlt 等)。

        关于调色板——32 位图像通常没有明确的调色板——调色板中需要 1670 万个(假设 8 位 alpha)值。通常,调色板假定为 8 位红色、8 位绿色、8 位蓝色,正如您在上面描述的那样。

        【讨论】:

        • 你好戴夫,我已经用你的方法更新了我的帖子。我无法继续进行,请您将您的帖子分成几个更简单的步骤,以便我可以跟进。谢谢拉杰
        • 您将获得正确的 DC 以在 OnPaint 函数中进行绘制。
        • 您可以使窗口无效以强制执行 OnPaint,或者按照 Nick D 的建议,使用 GetDC。
        猜你喜欢
        • 1970-01-01
        • 2014-01-24
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多