【问题标题】:HBITMAP or HDC to uint8[]HBITMAP 或 HDC 到 uint8[]
【发布时间】:2015-05-04 07:58:19
【问题描述】:

我通过以下操作获得了屏幕截图:

  1. GetDesktopWindow
  2. GetDC
  3. GetClientRect
  4. CreateCompatibleBitmap

这给了我一个HBITMAP,我可以选择把它带到HDC :

  1. CreateCompatibleDC

我的目标是从第 4 步 (CreateCompatibleBitmap) 或第 5 步 (CreateCompatibleDC) 得到一个 uint8 字节数组,这可能吗?

谢谢

【问题讨论】:

    标签: winapi


    【解决方案1】:

    你需要用CreateCompatibleDC()创建一个新的DC,用CreateDIBSection()为这个DC创建一个DIB(设备无关位图),用SelectObject()在新的DC中选择DIB,然后从你原来的DC复制使用BitBlt() 到新的DC。 CreateDIBSection 检索到的指针将指向原始数据。这个数据是系统分配的,也就是说你不需要自己分配,但是当你调用DeleteObject()为DIB时它会被释放。

    这是一个 C 语言示例:

    HDC hdcMemoryDC = CreateCompatibleDC(yourDC);
    
    BITMAPINFO bmi;
    
    memset(&bmi, 0, sizeof(BITMAPINFO));
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = width;
    bmi.bmiHeader.biHeight = -height;    // top-down
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 32;
    bmi.bmiHeader.biCompression = BI_RGB;
    
    HBITMAP hbmp;
    COLORREF *pixelBuffer;
    hbmp = CreateDIBSection( hdcMemoryDC, &bmi, DIB_RGB_COLORS, (VOID**)&pixelBuffer, NULL, 0 );
    
    SelectObject( hdcMemoryDC, hbmp );
    
    BitBlt( hdcMemoryDC, 0, 0, width, height, yourDC, 0, 0, SRCCOPY );
    

    【讨论】:

    • 非常感谢@ElderBug,不过我已经测试过了,它的表现很有趣。我去掉了错误检查和杂乱无章的 ctypes 东西来向你展示基本的调用。没有错误。但是hbmp 被返回为非空(它是指向0x8c012925 的指针)但pixelBuffer 被返回为空,你有什么怀疑吗?感谢剥离代码(memset 已处理等)显示函数调用和参数在这里:gist.github.com/Noitidart/858c407391369a5f814c
    • @Noitidart 我无法使用 C 重现此行为。就我而言,如果调用成功,pixelBuffer 总是有一个值(hbmp 有效)。这也是文档中所写的内容。你确定你在 JS 中处理pixelBuffer 的方式是正确的吗?
    • 非常感谢@ElderBug 的快速回复我也怀疑我在使用 pixelBuffer 时做错了什么。我将它设置为一个 COLOREF 数组,它是 nWidth * nHeight * 4 长,然后我将它转换为 void** 这是正确的方法吗?
    • @Noitidart 这看起来是一个不错且现实的解决方案。不相关,我想知道如果您使用屏幕 DC 而不是内存 DC 用于 CreateDIBSection 参数,您是否会注意到任何区别。如果没有区别,就用屏幕DC,应该会更好。
    • @Noitidart Cool :) 我看了你的其他帖子。最后你得到了性能不错的东西!
    猜你喜欢
    • 2015-09-08
    • 1970-01-01
    • 2023-03-29
    • 2011-06-26
    • 2011-11-27
    • 2012-09-08
    • 2012-12-12
    • 1970-01-01
    • 2020-12-14
    相关资源
    最近更新 更多