读书人

GetPixel太慢有什么快的方法?该怎么

发布时间: 2012-05-21 18:04:41 作者: rapoo

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( 

读书人网 >VC/MFC

热点推荐