CreatePatternBrush和屏幕颜色深度

时间:2010-06-04 15:53:14

标签: windows api gdi

我正在使用CreatePatternBrush创建一个画笔,并使用CreateBitmap创建一个位图。

位图宽1像素,高24像素,每个像素都有RGB值,所以我创建了一个rgbquads数组并将其传递给CreateBitmap。

当屏幕颜色深度为32bpp时这很好用,因为我创建的位图也是32bpp。

当屏幕颜色深度不是32bpp时,这会失败,我明白为什么会这样,因为我应该创建一个兼容的位图。

似乎我应该使用CreateCompatibleBitmap,但是如何将我拥有的像素数据放入该位图?

我还读过有关CreateDIBPatternBrushPt,CreateDIBitmap,CreateDIBSection等的内容。

我不明白什么是DIBSection,并且发现这个主题一般令人困惑。

我明白我需要一个与屏幕颜色深度相同的位图,但是如何创建只有32bpp像素数据的位图?

2 个答案:

答案 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解决了这个问题。我猜不是最好的选择,但它确实有用。