我正在使用CreatePatternBrush创建一个画笔,并使用CreateBitmap创建一个位图。
位图宽1像素,高24像素,每个像素都有RGB值,所以我创建了一个rgbquads数组并将其传递给CreateBitmap。
当屏幕颜色深度为32bpp时这很好用,因为我创建的位图也是32bpp。
当屏幕颜色深度不是32bpp时,这会失败,我明白为什么会这样,因为我应该创建一个兼容的位图。
似乎我应该使用CreateCompatibleBitmap,但是如何将我拥有的像素数据放入该位图?
我还读过有关CreateDIBPatternBrushPt,CreateDIBitmap,CreateDIBSection等的内容。
我不明白什么是DIBSection,并且发现这个主题一般令人困惑。
我明白我需要一个与屏幕颜色深度相同的位图,但是如何创建只有32bpp像素数据的位图?
答案 0 :(得分:2)
您可以创建DIB,因为您可以独立于屏幕颜色深度使用设备独立位图。请参阅CreateDIBSection()。
如何仅使用32bpp像素数据创建它?可以使用32bpp数据创建DIB。正如您可以在文档中看到的那样:
CreateDIBSection函数创建 应用程序可以写入的DIB 直。该功能为您提供了一个 指向位图位置的指针 位值。 如果hSection为NULL,则为系统 为DIB分配内存。如果 功能成功,返回值为 新创建的DIB的句柄,和 * ppvBits指向位图位值。
尝试这样的事情:
VOID *ppvBits = NULL;
BITMAPINFO BitmapInfo;
memset(&BitmapInfo, 0, sizeof(BITMAPINFOHEADER));
BitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
BitmapInfo.bmiHeader.biWidth = 1;
BitmapInfo.bmiHeader.biHeight = 24;
BitmapInfo.bmiHeader.biPlanes = 1;
BitmapInfo.bmiHeader.biBitCount = 32;
BitmapInfo.bmiHeader.biCompression = BI_RGB;
HBITMAP hBitmap = CreateDIBSection(hDC, &BitmapInfo, DIB_RGB_COLORS, &ppvBits, NULL, 0);
在我们的例子中,* ppvBits指向1 * 24 *(32/8)分配的字节。
重要的是要知道,如果biHeight是正数,则位图是自下而上的DIB,其原点是左下角。有关详细信息,请参阅BITMAPINFOHEADER Structure。
答案 1 :(得分:0)
我使用CreateCompatibleBitmap和SetPixel解决了这个问题。我猜不是最好的选择,但它确实有用。