![]() |
#2
minghan03132010-09-04 16:25
二楼贴上源代码
![]() #include <windows.h> #include <math.h> LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR LpcmdLine,int nCmdShow){ static TCHAR szAppName[]=TEXT("Painter"); static TCHAR szClassName[]=TEXT("PainterClass"); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style=CS_HREDRAW | CS_VREDRAW;//风格 wndclass.lpfnWndProc=WndProc;//*重要*long point to function 指向函数的的长指针 基于该窗口类创建的窗口所使用的窗口函数的入口地址 wndclass.cbClsExtra=0;//预留额外空间 wndclass.cbWndExtra=0;//预留额外空间 wndclass.hInstance=hInstance;//所在程序的实例句柄 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//图标 wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//图标 wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//背景色 wndclass.lpszMenuName=NULL;//指定窗口类的菜单 wndclass.lpszClassName=szClassName;//窗口类类名 if (!RegisterClass(&wndclass))//注册窗口类 需要一个指向windclass的指针 { MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR); return 0; } hwnd=CreateWindow(szClassName,//窗口类名称 TEXT("Painter"),//窗口标题 WS_OVERLAPPEDWINDOW,//窗口显示风格 CW_USEDEFAULT,//初始x方向位置 CW_USEDEFAULT,//初始y方向位置 CW_USEDEFAULT,//初始x方向大小 CW_USEDEFAULT,//初始y方向大小 NULL,//父窗口句柄 NULL,//菜单句柄 hInstance,//程序实例句柄 NULL);//创建参数 可以访问以后想要引用的程序中的数据 nCmdShow=SW_SHOWMAXIMIZED; ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { static int cxClient,cyClient,cxBitmap,cyBitmap; static HINSTANCE hInstance; static BITMAP bmp; static HANDLE h;//bmp图片句柄 static HDC hdc,hdcMemImag;//hdcMemImag是与窗口DC兼容的DC h=LoadImage(NULL,L"C:\\3333.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); GetObject(h,sizeof(BITMAP),&bmp);//得到图片的宽,高等信息,储存在bmp对象*/ switch(message) { case WM_CREATE: COLORREF colleft,colright;//colleft 左边图片的像素点 colright 右边图片的像素点 int leftR,rightR,leftG,rightG,leftB,rightB,absR,absG,absB; hdc=GetDC(hwnd);//得到窗口的DC(hWnd是窗口句柄) hdcMemImag=CreateCompatibleDC(hdc);//得到与窗口DC兼容的DC SelectObject(hdcMemImag,h);//把得到的DC与图片句柄关联起来 for (int y=192;y<=639;y++) //坐标是之前已经找好的 { for (int x=8;x<=505;x++) { colleft=GetPixel(hdcMemImag,x,y);//获得左边图片的像素点 colright=GetPixel(hdcMemImag,x+508,y);//获得右边图片的像素点 leftR=GetRValue(colleft); leftG=GetGValue(colleft); leftB=GetBValue(colleft); rightR=GetRValue(colright); rightG=GetGValue(colright); rightB=GetBValue(colright); absR=leftR-rightR; absG=leftG-rightG; absB=leftB-rightB; if (sqrt((DOUBLE)(absR*absR+absG*absG+absB*absB))>45) { SetPixel(hdcMemImag,x+508,y,RGB(0,255,0)); } } } ReleaseDC(hwnd,hdc);//释放GetDC得到的DC break; case WM_SIZE: InvalidateRect(hwnd,NULL,TRUE); break; case WM_PAINT: hdc=GetDC(hwnd);//得到窗口的DC(hWnd是窗口句柄) BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,hdcMemImag,0,0,SRCCOPY);//把图片画在窗体上 ReleaseDC(hwnd,hdc); break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hwnd,message,wParam,lParam); } |
先写了一个验证自己算法的小程序FindDifferences 我把QQ大家来找茬全屏后截了几张图片 FindDifferences所作的工作就是读取截屏bmp文件 对比截屏中两张找茬图片 找出不一样的地方 思路很简单 用GetPixel得到两个图片位置中相对位置的点的COLORREF值 如果不一样,就将两张中的一张图片中的这个点用纯色覆盖 有了想法就去写了 写出来之后运行 结果惨不忍睹 两张图片中没有几处地方是全相等的
************************************************************************************************
这里有一个问题 是否找茬游戏中的两张图片不可能除了找茬的位置之外COLOOREF完全相等?
************************************************************************************************
之后有人提醒我要有一定的容错率 因为没有接触过图形学 怎么容错不清楚 就去网上找了一下资料 有一个公式 sqrt(absR*absR+absG*absG+absB*absB)>100 具体原理我不懂 我就拿来用了 结果还算可以 但是容错的范围是随时要改的
***************************************************************************************************************
这里是第二个问题 两张图片对比是不是不能用GetPixel得到COLORREF来对比是否相等 必须要有容错率?
***************************************************************************************************************
对算法一筹莫展的时候去网上找了一个已经做好的QQ大家来找茬的辅助工具,不管窗口是否最小化,分辨率如何,找得都很精准,唉,信心倍受打击啊
***************************************************************************************************************
这里是第三个问题 是不是这种辅助程序不能用简单的对比颜色 还要涉及内存问题?
***************************************************************************************************************
下面是程序效果图:
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
[ 本帖最后由 minghan0313 于 2010-9-4 16:31 编辑 ]