C++ 从HDC读取像素
我试图读取HDC给定区域上的所有像素,以确定是否存在颜色,目前我想到:C++ 从HDC读取像素,c++,directx,gdi,C++,Directx,Gdi,我试图读取HDC给定区域上的所有像素,以确定是否存在颜色,目前我想到: IDirect3DSurface9* pSurface = 0; p1->CreateOffscreenPlainSurface(1280, 1024,D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &pSurface, NULL); p1->GetFrontBufferData(0, pSurface); //assert( pSurface ); if( pSurface &a
IDirect3DSurface9* pSurface = 0;
p1->CreateOffscreenPlainSurface(1280, 1024,D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &pSurface, NULL);
p1->GetFrontBufferData(0, pSurface);
//assert( pSurface );
if( pSurface && GetTickCount() > dwGAKS_Fix )
{
HDC dc;
pSurface->GetDC( &dc );
COLORREF dpurp = D3DCOLOR_ARGB (255,102,0 ,153);
for( DWORD h = 610; h <= 670; h++ )
{
for( DWORD w = 480; w<=530; w++ )
{
COLORREF dwPixel = GetPixel( dc, h, w );
// CString strPixel; strPixel.Format( "Pixel col: %u at: %u X %u", dwPixel, d, i );
//if( dx_Font )
if( dwPixel == dpurp )
{
dx_Font->DrawTextA(NULL, "Shoot", strlen("Shoot"), &pos, DT_NOCLIP, D3DCOLOR_XRGB(0, 255, 0));
}
else
dx_Font->DrawTextA(NULL, "NoShoot", strlen("NoShoot"), &pos, DT_NOCLIP, D3DCOLOR_XRGB(0, 255, 0));
}
}
dwGAKS_Fix = GetTickCount() + 15;
pSurface->ReleaseDC( dc );
pSurface->Release();
GetPixel
总是很慢。您可以使用IDirect3DSurface9::LockRect
直接访问屏幕外表面中的位,然后自己扫描位图,这应该会快得多
(编辑)任何给定像素(x,y)都是在以下位置找到的32位值:
*(DWORD*)(((BYTE*)d3dlocked.pBits) + y * d3dlocked.Pitch + x * sizeof(DWORD));
您应该使用0x00ffffff和值来忽略alpha通道。嘿,Jonathan谢谢您的回答,您可以发布一个示例,说明如何使用
D3DLOCKED\u RECT
比较像素颜色吗?谢谢(编辑了问题,我当前的解决方案有问题…)编辑了我的问题以添加一个小示例。
*(DWORD*)(((BYTE*)d3dlocked.pBits) + y * d3dlocked.Pitch + x * sizeof(DWORD));