C++ 显示32位位图-调色板

C++ 显示32位位图-调色板,c++,windows,image,bitmap,C++,Windows,Image,Bitmap,我有一个32位扫描仪的缓冲区(长型)中的图像数据 例如,缓冲区[0]对应的像素值为952,即[184,3,0,0]以下是您可能喜欢的策略: 创建与扫描数据大小相同、格式相同的位图(使用CreateDIBSection) 使用GetDIBits获取像素数据的基址 将数据(从扫描仪)复制到GetDIBits返回的地址 现在渲染位图!(使用BitBlt或类似的东西) 关于调色板-通常,32位图像没有显式调色板-调色板中需要1670万(假设8位alpha)值。通常,调色板假定为8位红色、8位绿色、8位蓝

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


例如,缓冲区[0]对应的像素值为952,即[184,3,0,0]以下是您可能喜欢的策略:

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

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

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

现在渲染位图!(使用BitBlt或类似的东西)


关于调色板-通常,32位图像没有显式调色板-调色板中需要1670万(假设8位alpha)值。通常,调色板假定为8位红色、8位绿色、8位蓝色,如上所述。

如果您只想在屏幕上打印,另一种选择是使用TinyPTC()。它只有3个函数,如果你只想绘制一些像素,它非常简单


编辑:似乎是TinyPTC的延续,可能是首选。

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

一种CBitmap对象(MFC)及其实现方法

win32例程。

现在,您可以使用在一个平面上绘制它。要获得窗口DC,请使用


无需为32位图像创建托盘。

这里有一种简化的方法,您可以尝试,分为以下步骤:

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_绘制处理程序中:

  • 选择hBitmap进入临时兼容HDC
  • 从兼容的HDC调用BitBlt(…,SRCCOPY)到窗口的HDC。其他参数应该是显而易见的。一开始不要尝试伸展或做任何花哨的事情
  • 请记住在销毁临时HDC之前将原始虚拟位图选择到临时HDC中
  • 如果看不到结果,请尝试通过vImageBuff循环,并将每个像素设置为RGB(255、0、0)或类似的值,以检查其余逻辑是否正常

    如果未绘制任何图形,请确保每个像素的alpha分量为255


    如果你得到的是一幅乱码图像,那么你需要仔细检查像素格式、步幅等。

    Windows需要的是BGRA,而不是RGBA,不是吗?嗨,乌本,我的理解是,像素将在内存中表示为BGRA。Windows倾向于使用小尾端,这就是为什么它存储为BGRA而不是ARGBHello Dave,我已经用你的方法更新了我的帖子。我不能继续下去了,请你把你的帖子分成几个简单的步骤,这样我就可以跟上了。谢谢,您将在OnPaint函数中获得正确的DC进行绘制。您可以使窗口无效以强制OnPaint,或者按照Nick D的建议,使用GetDC。
    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);
    
    }
    
    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);