c - win32 - 如何将屏幕捕获为 8 位或 16 位位图?

标签 c winapi bitmap

我刚刚开始使用 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/

相关文章:

android - 删除绘图缓存

c - 程序读取文件但不应该跳过 "skips"行

c++ - 如果你使用 char *ptr 存储整型变量的地址会发生什么

c++ - 防止窗口移动

c - 如何获取窗口的CREATESTRUCT?

iphone - 如何在iOS中进行位图比较?

android - 在 Android 上使用 NDK 的位图无限制堆内存库

#define 之外的 C 预处理器连接

c - 错误 : redeclaration of enumerator for contiki os libtomcrypt library

c++ - 如何查看应用程序的工作时间?