GetPixel太慢,有什么快的方法?
HBITMAP hbmp,hbmp2;
HDC hdc,hmemdc;
char *data,*p;
hdc=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
hmemdc=CreateCompatibleDC(hdc);
hbmp=CreateCompatibleBitmap(hdc,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
hbmp2=SelectObject(hmemdc,hbmp);
BitBlt(hmemdc,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),hdc,0,0,SRCCOPY);
hbmp=SelectObject(hmemdc,hbmp2);
data=calloc(3,GetSystemMetrics(SM_CXSCREEN)*GetSystemMetrics(SM_CYSCREEN));
GetBitmapBits(hbmp,px*py*3,data);
找了好多资料,写了上面的代码,按道理说已经把数据取到了data中了,可是验证却发现好象不对头
想问下这个错在哪里?
或者有好心人把能用的代码发一个给我,网上找到的大多都不全。
[解决办法]
你是想拷屏吗?我有一个资源就是拷屏的,你可以看一下,最后数据都在一个位图类里面
[解决办法]
真的是拷屏?如果是直接用HWND hwnd = ::GetDesktopWindow(); HDC hDC = ::GetDC(hwnd);得到桌面DC就可以了
[解决办法]
记得CDC还有个GetCurrentBitmap
[解决办法]
getpixel是很慢,可以先拷屏,这样屏幕数据都到内存中了,速度还是很快的。
[解决办法]
GetPixel确实慢,有个API:GetDIBits也可以获取位图的数据,你试试
[解决办法]
1.GetDIBits把位图数据复制到内存缓冲
2.任意修改缓冲数据
3.SetDIBits把缓冲复制回DC
[解决办法]
int GetDIBits(
HDC hdc, // handle to DC
HBITMAP hbmp, // handle to bitmap
UINT uStartScan, // first scan line to set
UINT cScanLines, // number of scan lines to copy
LPVOID lpvBits, // array for bitmap bits
LPBITMAPINFO lpbi, // bitmap data buffer
UINT uUsage // RGB or palette index
);
正好我这里有示例代码,以前在CSDN上回复写的。
不过有人已经给出方向了,google一下GetDIBits能找到不少能用的代码,例如这个:
http://topic.csdn.net/t/20050218/15/3790238.html
不能指望每次提的问题都让别人给出严丝合缝的代码, 别人指出了正确的方向,咱们程序员就应该有能力去实现。
- C/C++ code
#include <math.h>void CDibtestDlg::OnOK() { // TODO: Add extra validation here HDC hDesktopDC = ::GetDC(NULL); HDC hTmpDC = CreateCompatibleDC(hDesktopDC); HBITMAP hBmp = CreateCompatibleBitmap(hDesktopDC, 500, 500); //500x500, 示例数据 SelectObject(hTmpDC, hBmp); BitBlt(hTmpDC, 0, 0, 500, 500, hDesktopDC, 0, 0, SRCCOPY); DeleteObject(hTmpDC); BITMAP bm; PBITMAPINFO bmpInf; if(GetObject(hBmp,sizeof(bm),&bm)==0) { ::ReleaseDC(NULL,hDesktopDC); return ; } int nPaletteSize=0; if(bm.bmBitsPixel<16) nPaletteSize=(int)pow(