我刚刚开始使用 win32 GDI 编程,很难找到好的引用资料。我有一个简单的应用程序,通过执行以下操作来捕获屏幕:
UINT32 x,y;
x = GetSystemMetrics(SM_CXSCREEN);
y = GetSystemMetrics(SM_CYSCREEN);
HDC hdc = GetDC(NULL);
HDC hdcScreen = CreateCompatibleDC(hdc);
HBITMAP hbmp = CreateCompatibleBitmap(hdc, x, y);
SelectObject(hdcScreen, hbmp);
BitBlt(hdcScreen, 0, 0, x, y, hdc, 0, 0, SRCCOPY)
ReleaseDC(NULL, hdc);
我正在捕获一个兼容的位图,该位图在我的机器上是 32 位的。使用相同/相似的调用,我将如何以 8 位捕获屏幕? 16 位怎么样?
最佳答案
使用CreateDIBSection创建一个 8bpp 位图,然后将 BitBlt 添加到该位图上。
填充 BITMAPINFO 结构将会很有趣。您不能使用普通的 BITMAPINFO 结构,因为它仅为单个调色板条目分配空间,并且对于 8bpp 图像 - 您将需要完整的 256 个条目。
如果你想作弊一点,可以使用匿名 union 来声明一个 BITMAPINFO,为其调色板提供足够的空间。
union
{
BITMAPINFO bmi;
struct {
BITMAPINFOHEADER bmih;
RGBQUAD extra[256];
} dummy;
};
bmi.bmiHeader.biSize = sizeof (bmi.bmiHeader);
bmi.biBitCount = 8;
// and so on.
至于颜色表中要初始化的值...我想不出一种简单的方法可以在 GDI 不处于 8bpp 模式时从 GDI 获取默认 8bpp 调色板。我怀疑 CreateHalftonePalette不会在非调色板设备上执行任何操作。
关于c - win32 - 如何将屏幕捕获为 8 位或 16 位位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2859885/