我用CreateBitmap创建的位图,用CreatePatternBrush创建了一个画笔。
这个位图有1个像素宽,24个像素高,我有每个像素的RGB值,所以我创建了一个rgbquad数组并将其传递给CreateBitmap。
当屏幕颜色深度为32bpp时,这很好用,因为我创建的位图也是32bpp。
当屏幕颜色深度不是32bpp时,这会失败,我理解为什么会这样,因为我应该创建一个兼容的位图。
似乎我应该使用CreateCompatibleBitmap,但是我如何将我拥有的像素数据放入那个位图中呢?
我还读过关于CreateDIBPatternBrushPt、CreateDIBitmap、CreateDIBSection等的文章。
我不明白什么是DIBSection,并且发现这个主题通常令人困惑。
我确实知道我需要一个与屏幕具有相同颜色深度的位图,但是我如何创建只有32bpp像素数据的位图呢?
发布于 2010-06-06 15:14:49
您可以创建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。
发布于 2010-06-05 02:04:43
我用CreateCompatibleBitmap和SetPixel解决了这个问题。我想这不是最好的选择,但它是可行的。
https://stackoverflow.com/questions/2975757
复制相似问题