标签: createdibsection

如何将像素数组转换为HBITMAP

我有一个像素数组,我需要转换为HBITMAP才能在窗口中显示它.我尝试使用CreateDIBitmap()但我没有BMP标头.我尝试根据MSDN文档手动构建它们,但这不起作用.

这是我的代码看起来如何

HBITMAP hBitmap
char pixels[160*120]; // White grayscale image of size 160x120
memset(pixels,255,sizeof(pixels));

BITMAPINFOHEADER bmih;
bmih.biSize     = sizeof(BITMAPINFOHEADER);
bmih.biWidth    = 160;
bmih.biHeight   = -120;
bmih.biPlanes   = 1;
bmih.biBitCount = 8;
bmih.biCompression  = BI_RGB ;
bmih.biSizeImage    = 0;
bmih.biXPelsPerMeter    =   10;
bmih.biYPelsPerMeter    =   10;
bmih.biClrUsed  =0;
bmih.biClrImportant =0;

BITMAPINFO dbmi;
dbmi.bmiHeader = bmih;
dbmi.bmiColors->rgbBlue = 0;
dbmi.bmiColors->rgbGreen = 0;
dbmi.bmiColors->rgbRed = 0;
dbmi.bmiColors->rgbReserved = 0;
void* bits = (void*)&(pixels[0]); 
hBitmap = CreateDIBitmap(localDC, &bmih, CBM_INIT, qB.bmBits, &dbmi, DIB_RGB_COLORS);
Run Code Online (Sandbox Code Playgroud)

现在我得到一个非NULL的hBitmap,它很好,但它总是显示黑色图像,好像它没有指向像素数组.我使用代码检查了它

BITMAP qB; …
Run Code Online (Sandbox Code Playgroud)

c++ dib winforms createdibsection

9
推荐指数
2
解决办法
7256
查看次数

了解GetDiBits.C++

MSDN表示GetDiBits在调用此函数之前,不应将用于的位图选择为DC.但是从我的经验来看,BitBlt我知道除非选择了位图,否则我无法绘制位图.

  1. 怎么GetDiBits绕过这个?我可以使用未选择的,新创建的位图作为此函数的参数吗?
  2. GetDiBitsCreateDibSection返回一个数组.但是MSDN谈到了第一个功能:

    "指定的兼容位图的位"

    我认为DI代表DeviceIndependent.为什么会出现矛盾?这意味着,根据MSDN,GetDiBits只能用CreateCompatibleBitmap(哪个是DD)?然后我不能将这个数组发送到另一台机器来显示它,对吗?

  3. 这两个函数都使用hDC.如果CreateDibSection真的是DIndependent为什么它需要一个hDC?所有需要的信息都是通过bitmapinfoheader提供的......

winapi dib getdibits createdibsection

2
推荐指数
1
解决办法
186
查看次数

标签 统计

createdibsection ×2

dib ×2

c++ ×1

getdibits ×1

winapi ×1

winforms ×1