如何使用 Direct2D 从窗口中获取像素

Posted

技术标签:

【中文标题】如何使用 Direct2D 从窗口中获取像素【英文标题】:How to get pixels from window using Direct2D 【发布时间】:2014-07-04 08:44:57 【问题描述】:

我的问题是在窗口中获取像素。我找不到办法做到这一点。我使用标准的 Windows 函数和 Direct2D(不是 DirectDraw)。 我正在使用新窗口的标准初始化:

WNDCLASS wc;
wc.style = CS_OWNDC; 
wc.lpfnWndProc = WndProc; 
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(6);   
wc.lpszMenuName = 0;
wc.lpszClassName = L"WINDOW"; RegisterClass(&wc); 
hWnd = CreateWindow(L"WINDOW", L"Game", WS_OVERLAPPEDWINDOW,100,100,1024,768,NULL,NULL,hInstance,NULL);

然后我创建一个D2D1factory 对象并在窗口中绘制位图:

HWND hWnd = NULL;
srand((unsigned int)time((time_t)NULL));

ID2D1Factory* factory = NULL;
ID2D1HwndRenderTarget* rt = NULL;
CoInitializeEx(NULL,COINIT_MULTITHREADED);
My_CreateWindow(&hWnd, hInstance);
My_CreateFactory(&hWnd, factory, rt);
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,&factory);

factory->CreateHwndRenderTarget(RenderTargetProperties(), HwndRenderTargetProperties(hWnd,SizeU(800,600)), &rt);

// tons of code

rt->BeginDraw(); rt->DrawBitmap(background[0], RectF(0,0,800,600));
rt->DrawBitmap(GIFHorse[(int)iterator],
RectF(0+MyX-100,0+MyY-100,100+MyX,100+MyY));
rt->DrawBitmap(Star[(int)iterator], RectF(0 + starX, 0 + starY, 50 + starX, 50+starY)); rt->EndDraw();

我需要计算点击次数(我正在尝试制作简单的游戏)。所以这就是为什么我需要访问窗口中的所有像素。

我正在考虑使用其他算法,但它们更难制作,我想从更简单的开始。

我知道GetPixel() 函数,但我不明白我应该为HDC 使用什么。

【问题讨论】:

【参考方案1】:

没有简单易行的方法来获得 D2D 像素。

可以使用几何图形实现简单的碰撞检测。如果您在ID2D1Geometry 对象中有对象的轮廓,您可以使用ID2D1Geometry::CompareWithGeometry 比较它们。

如果您坚持使用像素,访问它们的方法是通过 DC 获得,可通过 IDXGISurface1::GetDC 获得

在这种情况下,您需要使用 DXGI 表面渲染目标和交换链而不是 hwnd 渲染目标。

一步一步:

    D3D11CreateDeviceAndSwapChain 为您提供交换链。 IDXGISwapChain::GetBuffer 为您提供 DXGI 界面。 ID2D1Factory::CreateDxgiSurfaceRenderTarget 为您提供渲染目标。 IDXGISurface1::GetDC 为您提供 DC。阅读此页面上的备注!

【讨论】:

以上是关于如何使用 Direct2D 从窗口中获取像素的主要内容,如果未能解决你的问题,请参考以下文章

如何从窗口获取像素数据\像素缓冲区并提取RGB?

为啥 direct2d 看起来像素化且不准确?

如何使用 Direct2D 创建自定义窗口镶边?

CUDA如何从屏幕获取像素?

从背景中的窗口获取像素颜色

使用 PIL 从图像中获取像素