从HDC读取像素
Read pixels from a HDC
我试图读取HDC的给定区域上的所有像素,以查找是否存在颜色,目前我想到:
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();
但是这个解决方案很慢,非常慢,我需要一些更专业的东西
<标题>编辑D3DLOCKED_RECT d3dlocked;
if( D3D_OK == pSurface->LockRect( &d3dlocked, 0, 0 ) )
{
UINT *pixels=(UINT *)locked.pBits;
if(pixels[52+15*1024]&0xFFFFFF00==dpurp)
{
}
pSurface->UnlockRect();
}
标题>GetPixel
总是很慢。您可以使用IDirect3DSurface9::LockRect
直接访问屏幕外表面的位,然后自己扫描位图,这应该要快得多。
(编辑)任何给定的像素(x,y)是在
找到的32位值:*(DWORD*)(((BYTE*)d3dlocked.pBits) + y * d3dlocked.Pitch + x * sizeof(DWORD));
您应该与0x00ffffff的值忽略alpha通道。
相关文章:
- 如何使用Qt读取我的应用程序屏幕像素数据
- 如何在C 中读取DICOM像素
- OpenGL使用glfw通过HIDDEN窗口进行屏幕外渲染和读取像素值
- 读取的像素类型
- 从位图图像文件读取像素数据值
- 在 c++ 中读取"bitmap"像素
- C/C++LIBTIFF:需要从BW TIFF文件中读取白色和黑色像素的像素位置
- 我必须更改的内容是我可以从数组中读取像素值
- 无法读取正确的 PGM 像素值
- OpenCV读取图像像素值
- 在 C 和 C++ 中从 JPEG 读取黑白像素作为数组
- 在C++中将图像数据(R,G和B像素)读取到2D数组中
- 使用 boost.gil 逐像素读取.png文件
- SDL 从纹理中读取像素
- big_endian和little_endian的图像像素读取
- 如何从Mat变量编辑/读取OpenCv中的像素值
- 从bmp文件读取RGB像素
- 在像素GLSL中存储(并读取)大量数据
- SDL2逐像素读取PNG24
- 从Qt中的每个像素读取Alpha通道