首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从屏幕HDC中保存像素

从屏幕HDC中保存像素
EN

Stack Overflow用户
提问于 2019-04-03 20:39:57
回答 1查看 205关注 0票数 0

许多论坛提供了关于如何进入数组(屏幕像素的副本)的以下代码:

代码语言:javascript
复制
char* Pixels = NULL;
HDC MemDC = CreateCompatibleDC(Context);
HBITMAP Section = CreateDIBSection(Context, &Info, DIB_RGB_COLORS, (void**)&Pixels, 0, 0);
DeleteObject(SelectObject(MemDC, Section));
BitBlt(MemDC, 0, 0, Width, Height, Context, Area.left, Area.top, SRCCOPY);
DeleteDC(MemDC);
std::fstream hFile(FilePath, std::ios::out | std::ios::binary);
if (hFile.is_open())
{
    hFile.write((char*)&Header, sizeof(Header));
    hFile.write((char*)&Info.bmiHeader, sizeof(Info.bmiHeader));
    hFile.write(Pixels, (((BitsPerPixel * Width + 31) & ~31) / 8) * Height);
    hFile.close();
    DeleteObject(Section);
    return true;
}

(链接)

但这实际上涉及到将像素“内存”区域从屏幕HDC复制到内存中的区域。为什么不这样做:

代码语言:javascript
复制
char* Pixels = NULL;
HBITMAP Section = CreateDIBSection(Context, &Info, DIB_RGB_COLORS, (void**)&Pixels, 0, 0);
SelectObject(Context, Section);

上下文HDC已经包含所有数据。为什么我不能直接读一读?

我认为位图必须被选择为HDC,而HDC 实际上是携带数据的。那么,为什么CreateDIBSection返回一个指针,尽管位图尚未被选中到任何HDC中?(如果它提供指向作为参数传递的HDC内存的指针,则数组已经包含屏幕的像素值,但情况并非如此,因为仍然需要BitBlt。)

我得出这个结论是因为BitBlt接受HDC参数,而不是位图。这可能意味着它会将数据复制到相关的HDC。

EN

回答 1

Stack Overflow用户

发布于 2019-04-03 21:34:19

视频存储器可以存储在多个地方,包括主系统存储器(RAM)、视频卡上的专用存储器、外部显示设备,甚至是其中的一些组合。对这个内存的访问可能很慢,并且进程可能无法访问该内存(至少它需要映射到进程的地址空间)。

在传递到应用程序之前,可能需要将存储在硬件中的视频数据转换成不同的格式。该硬件可以利用其他方法复制不直接涉及CPU的数据(如直接内存访问( directly,DMA) )。由于复制确实需要一些时间,所以在复制到主内存之前,您想要的部分可能会被复制到视频适配器上的另一段视频内存(这可能是非常快速的进程)。

视频显示也是一个共享资源:系统上的所有进程都可能需要访问它。如果你有一个指向视频内存的指针,你读到的可能不是可见的(如果它被更新为不同的内容),或者你可能会破坏屏幕如果你写到它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55503900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档