//////////////////////////////////////////////////////////////////////////////////// #if !defined(MYFINDPICTURECLASS_H) #define MYFINDPICTURECLASS_H #include #include "d3d9.h" #include #include #include class MyFindPictureClass { public: MyFindPictureClass(void); ~MyFindPictureClass(void); enum RUNTYPE { TurnUP = 0, TurnDOWN, TurnLEFT, TurnRIGHT, TurnERRORR }; //LPDIRECT3DDEVICE9 m_pDxdevice; //HWND m_Wnd; bool isprocessColor;//说明是找色或者取色 int loadWidth; int loadHeight; HWND m_parenthwnd; HBITMAP hDXBitmap; HDC hDXMemDC; HWND m_hwnd; DWORD m_displayMode;//图色模式 bool IsLastFindStr;//是否最后一次查找 //COLORREF pWndBmpBuffer[2000][2000]; COLORREF** pWndBmpBuffer; //DWORD ColorDataInfo[2000][2000]; BYTE* pBuffer; //COLORREF** pColorBuffer; int wndWidth; int wndHeight; int nbuffersize; PVOID pbuffer; bool SaveGDIBitmap(HWND hWnd, RECT rect, wchar_t* savepath); bool SaveBitmapToFile(HBITMAP hBitmap, LPCWSTR lpFileName); bool CopyScreenToBitmap(LPRECT lpRect, wchar_t* savepath); DWORD GetBkMouseShape(HCURSOR bkmouseshape = NULL);//默认bkmouseshape为空时为前台模式, bkmouseshape有值的时候是后台模式 bool loadBitmap(wchar_t* path); //////////////////找图 支持的是24位位图///////////////////// //// 图片格式错误或者没找到图片,函数返回-1 //// 参数 说明 //// hwnd 窗口的句柄,为NULL表示前台查找,不为NULL表示后台查找 //// left 左上角x //// top 左上角y //// right 右下角x //// bottom 右下角y //// path 图片的路径,支持多张图片,使用"|"隔开 //// colorOffset 色偏 例如"102030" //// simi 相似度 //// dir 检索方式 //// xpos 返回的图片的左上角x坐标 //// ypos 返回的图片的左上角y坐标 int findPicture(PVOID pbuffer, HWND hwnd, int left, int top, int right, int bottom, wchar_t* path, wchar_t* color, double simi, int dir, long& x, long& y, DWORD(*ColorDataInfo)[2000], wchar_t* retstring = NULL, int type = 0); /////// 颜色内存处理。。 提高速度 ////////////////////// bool processCreenWindow(int color, int left, int top, int right, int bottom, double simi, int dir, int& x, int& y, wchar_t* colorStr = NULL, bool isMulitColor = false); /////// 后台颜色内存处理。。 提高速度 ////////////////////// int processColor(PVOID pbuffer, HWND hwnd, int& color, int left, int top, int right, int buttom, double simi, int dir, long& x, long& y, DWORD(*ColorDataInfo)[2000], wchar_t* colorstr = NULL, wchar_t* retstring = NULL, wchar_t* MultiColor = NULL); //将BMP图转JPG图 bool BMP2JPG(wchar_t* strBMPFile, wchar_t* strJPGFile); //将BMP图转PNG图 bool BMP2PNG(wchar_t* strBMPFile, wchar_t* strPNGFile); //////////////////////////////////////////////////////////////////////////////////////找字算法 int strColor;//字的颜色 int strColors[MAX_PATH];//字的颜色 int strColoroff[MAX_PATH];//字的色偏 int ncount;//记录位图加载的点阵个数 int addrxy[MAX_PATH * 10][4]; int dictindex;//记录当前字库的数量 int usingindex; //当前使用字库的下标 std::vector pWndBmpStr[2048]; short** pWndBmpStrxy;//存储当前图片的所有坐标对于的整形值 wchar_t SetPath[MAX_PATH]; //wchar_t SetPicPwdString[MAX_PATH]; //COLORREF **pLoadstrBuffer; //COLORREF pLoadstrBuffer[11][MAX_PATH-10]; void hextobyte(char* hexStr, char* byteStr);//将十六进制字符串转换成二进制字符串 //void byteTopic(short strvalue[MAX_PATH],int strwide,COLORREF pLoadstrBuffer[11][MAX_PATH-10]);//二进制数值还原成图片MAX_PATH void byteTopic(short strvalue[MAX_PATH], int strwide);//二进制数值还原成图片MAX_PATH //bool comparaStrTosim(COLORREF pLoadstrBuffer[11][MAX_PATH-10],int strwide,int strhight,int &RetX,int &RetY,int startX,int startY,float simi,int nstrcount); //相似度匹配 bool comparaStrTosim(int strwide, int strhight, int& RetX, int& RetY, int startX, int startY, float simi, int nstrcount); //相似度匹配 bool comparaStr(short pLoadstrBufferxy[MAX_PATH], int strwide, int strhight, int& RetX, int& RetY, int startX, int startY, float simi, int nstrcount);//匹配字符串 void dicthextobyte(char* hexStr, char* byteStr, int& hexlen, short& nstrinfo);// 字库信息转二进制 bool GetStringInfo();//获取位置点阵信息 //获取位置点阵信息,和GetStringInfo区别是,多了一层X坐标的扫描,排除多余无效的点阵信息 bool GetStringInfo1(); bool MySetDict(int nindex, wchar_t* dictpath, pMyDictInfo* MyDictCount, int* nMyDictCountsize, int& NowUsingDictIndex);//设置字库 加载字库 bool MyUseDict(int Useindex, pMyDictInfo* MyDictCount, int& NowUsingDictIndex); //使用字库 bool MyDeleteDict(int deleteindex, pMyDictInfo* MyDictCount, int* nMyDictCountsize, int& NowUsingDictIndex); //删除字库 int ocr(PVOID pbuffer, HWND hwnd, int left, int top, int right, int bottom, wchar_t* color_format, double simi, wchar_t* retstr, pMyDictInfo* MyDictCount, int* nMyDictCountsize, int NowUsingDictIndex, DWORD(*ColorDataInfo)[2000], int type = 0); int FindStr(PVOID pbuffer, HWND hwnd, int left, int top, int right, int bottom, wchar_t* strings, wchar_t* color, double simi, long& x, long& y, pMyDictInfo* MyDictCount, int* nMyDictCountsize, int NowUsingDictIndex, DWORD(*ColorDataInfo)[2000], wchar_t* retstring = NULL, int type = 0); int FindStrFast(PVOID pbuffer, HWND hwnd, int left, int top, int right, int bottom, wchar_t* strings, wchar_t* color, double simi, long& x, long& y, pMyDictInfo* MyDictCount, int* nMyDictCountsize, int NowUsingDictIndex, DWORD(*ColorDataInfo)[2000], wchar_t* retstring = NULL, int type = 0); //pMyDictInfo mydict; //////////////////////////////////////////////////////////////////////////////////////找字算法 private: bool IsFindPicNext; COLORREF** pLoadBmpBuffer; //COLORREF** pWndBmpBuffer; int ncolors; //色偏个数 BYTE m_colorOffsR; // R的偏移量 BYTE m_colorOffsG; // G的偏移量 BYTE m_colorOffsB; // B的偏移量 BYTE m_colorOffR[MAX_PATH]; // R的偏移量 BYTE m_colorOffG[MAX_PATH]; // G的偏移量 BYTE m_colorOffB[MAX_PATH]; // B的偏移量 /*double m_sim; // 相似度*/ //未使用该变量 int m_Dir; // 检索方式 int m_simColor; // 相似度的颜色边界值 //////////////////////////////存储传进来的四点的范围///////////// int m_Left; // 左上点 int m_Top; // 顶端点 int m_Right; // 右下点 int m_bottom; // 底端点 int xpos_offset; int ypos_offset; ///////////////////////////// 助记透明图的处理 ///////////// int m_helpXpoint; int m_helpYpoint; //bool catchWindowBitmap(); //bool processBKWindows(HWND src_hWnd); //配合BMP2JPG使用 int GetEncoderClsid(const WCHAR* format, CLSID* pClsid); bool getGDIBitmap(HWND wnd, RECT rc, int typemode = 0);//初始默认为找图 ,typemode=0 bool getDXBitmap(PVOID pbuffer, DWORD(*ColorDataInfo)[2000], int typemode = 0);//初始默认为找图 ,typemode=0 bool findImage(wchar_t* path, long& x, long& y, int type = 0); bool comparabmp(int startX, int startY, int endX, int endY); //////////////// 检索 方式 ////////////////// //////////////////////////////////0:从左到右,从上倒下///////////////////// bool leftToRightFromTop(long& x, long& y); //////处理背景色为透明的图片//////////////// bool comparaLeftToRightFromTop(int h, int w, int startX, int startY); //////处理背景色为不透明的图片//////////////// bool comparaLeftToRightFromTopEx(int h, int w); ////////////////////////////////////1:从左到右,从下倒上////////////////// bool leftToRightFromBottom(long& x, long& y); ////////处理背景色为透明的图片//////////////// bool comparaLeftToRightFromBottom(int h, int w, int startX, int startY); ////////处理背景色为不透明的图片//////////////// bool comparaLeftToRightFromBottomEx(int h, int w); ////////////////////////////////////2:从右到左,从上倒下////////////////// bool rightToLeftFromTop(long& x, long& y); ////////处理背景色为透明的图片//////////////// bool comparaRightToLeftFromTop(int h, int w, int startX, int startY); ////////处理背景色为不透明的图片//////////////// bool comparaRightToLeftFromTopEx(int h, int w); //////////////////////////////////3:从右到左,从下倒上/////////////////// bool rightToLeftFromBottom(long& x, long& y); ////////处理背景色为透明的图片//////////////// bool comparaRightToLeftFromBottom(int h, int w, int startX, int startY); ////////处理背景色为不透明的图片//////////////// bool comparaRightToLeftFromBottomEx(int h, int w); COLORREF RgbToBgb(__in COLORREF rgb); bool FindMultiColor(wchar_t* MultiColor, int i, int j, int Bottom, int right, int help_simi); }; #endif