VC中文网-VC-MFC编程论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 22622|回复: 151

VC找图找色模块 已封装可以直接调用

  [复制链接]
发表于 2014-6-21 10:42:42 | 显示全部楼层 |阅读模式
#include "iostream.h"
char   *lpBufscr,*lpBufbmp;
BITMAP   bb,bm;//bb=屏幕  bm=图片
DWORD   dwX,dwY;
struct Points
{
POINT pts;
struct Points *next;
};
void GetScreenData(int dx,int dy)
{
HBITMAP   hBitmap,hOld;
HDC   hDC,hcDC;
BITMAPINFO   b;
HANDLE   hp;
// DWORD   dwX,dwY;
dwX=GetSystemMetrics(SM_CXSCREEN);
dwY=GetSystemMetrics(SM_CYSCREEN);
dwX=min(dwX,(unsigned)dx);
dwY=min(dwY,(unsigned)dy);
hDC=::GetWindowDC(NULL);
hcDC=CreateCompatibleDC(hDC);
hBitmap=CreateCompatibleBitmap(hDC,dwX,dwY);
hOld=(HBITMAP)SelectObject(hcDC,hBitmap);
BitBlt(hcDC,0,0,dwX,dwY,hDC,0,0,SRCCOPY);
bb.bmWidth=dwX;
bb.bmHeight=dwY;
bb.bmPlanes=1;
bb.bmWidthBytes=bb.bmWidth*3;
bb.bmBitsPixel=3;
bb.bmType=0;
b.bmiHeader.biSize   =   sizeof(BITMAPINFOHEADER);
b.bmiHeader.biWidth=dwX;
b.bmiHeader.biHeight=dwY;
b.bmiHeader.biPlanes   =   1;
b.bmiHeader.biBitCount   =24;
b.bmiHeader.biCompression   =   BI_RGB;
b.bmiHeader.biSizeImage   =   0;
b.bmiHeader.biXPelsPerMeter   =   0;
b.bmiHeader.biYPelsPerMeter   =   0;
b.bmiHeader.biClrUsed   =   0;
b.bmiHeader.biClrImportant   =   0;
b.bmiColors[0].rgbBlue=8;
b.bmiColors[0].rgbGreen=8;
b.bmiColors[0].rgbRed=8;
b.bmiColors[0].rgbReserved=0;
hp=GetProcessHeap();
lpBufscr=(char *)HeapAlloc(hp,HEAP_ZERO_MEMORY,bb.bmHeight*bb.bmWidth*4);
GetDIBits(hcDC,hBitmap,0,dwY,lpBufscr,&b,DIB_RGB_COLORS);
ReleaseDC(NULL,hDC);   
DeleteDC(hcDC);   
DeleteObject(hBitmap);   
DeleteObject(hOld);   
// HeapFree(hp,0,lpBufscr);
}
void GetBmpData(LPCTSTR lpszName)
{
HANDLE hp;
HDC hdc,hdcmem;
HBITMAP hBm;
BITMAPINFO   b;
hBm=(HBITMAP)LoadImage(NULL,/*"c:\\1.bmp"*/lpszName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);
GetObject(hBm,sizeof(BITMAP),(LPVOID)&bm);
hdc=::GetWindowDC(NULL);
hdcmem=CreateCompatibleDC(hdc);
SelectObject(hdcmem,hBm);
BitBlt(hdcmem,0,0,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY);
b.bmiHeader.biSize   =   sizeof(BITMAPINFOHEADER);
b.bmiHeader.biWidth=bm.bmWidth;
b.bmiHeader.biHeight=bm.bmHeight;
b.bmiHeader.biPlanes   =   1;
b.bmiHeader.biBitCount   =24;
b.bmiHeader.biCompression   =   BI_RGB;
b.bmiHeader.biSizeImage   =   0;
b.bmiHeader.biXPelsPerMeter   =   0;
b.bmiHeader.biYPelsPerMeter   =   0;
b.bmiHeader.biClrUsed   =   0;
b.bmiHeader.biClrImportant   =   0;
b.bmiColors[0].rgbBlue=8;
b.bmiColors[0].rgbGreen=8;
b.bmiColors[0].rgbRed=8;
b.bmiColors[0].rgbReserved=0;
hp=GetProcessHeap();
lpBufbmp=(char *)HeapAlloc(hp,HEAP_ZERO_MEMORY,bm.bmHeight*bm.bmWidth*4);
GetDIBits(hdc,hBm,0,bm.bmHeight,lpBufbmp,&b,DIB_RGB_COLORS);
DeleteObject(&hBm);
DeleteDC(hdc);
DeleteDC(hdcmem);
}
//释放lpBuf
int ReleaseLP()
{
HANDLE hp=GetProcessHeap();
HeapFree(hp,0,lpBufscr);
HeapFree(hp,0,lpBufbmp);
return 0;
}

int GetScrPixel(int x,int y)//获取屏幕颜色
{
if(x<0 || x>(int)dwX || x<0 || x>(int)dwY)return-1;
BYTE   bBlue=lpBufscr[bb.bmWidthBytes*(dwY-y-1) + bb.bmBitsPixel*x + 0];
BYTE   bGreen=lpBufscr[bb.bmWidthBytes*(dwY-y-1) + bb.bmBitsPixel*x + 1];
BYTE   bRed=lpBufscr[bb.bmWidthBytes*(dwY-y-1) + bb.bmBitsPixel*x + 2];
COLORREF   color=RGB(bBlue,bGreen,bRed);
return int(color);
}
int GetBmpPixel(int x,int y)//获取位图颜色
{
if(x<0 || x>(int)dwX || x<0 || x>(int)dwY)return-1;
BYTE   bBlue=lpBufbmp[bm.bmWidthBytes*(bm.bmHeight-y-1) + bm.bmBitsPixel*x/8 + 0];
BYTE   bGreen=lpBufbmp[bm.bmWidthBytes*(bm.bmHeight-y-1) + bm.bmBitsPixel*x/8 + 1];
BYTE   bRed=lpBufbmp[bm.bmWidthBytes*(bm.bmHeight-y-1) + bm.bmBitsPixel*x/8 + 2];
COLORREF   color=RGB(bBlue,bGreen,bRed);
return int(color);
//return lpBufbmp[1];
}

//查找矩形区域内颜色值为 color的点
//从左往右逐行往下找
//找到返回1,并将坐标赋值给参数(fx,fy),找不到则返回0
int FindColor(int x1,int y1,int x2,int y2,int color,int &fx,int &fy)
{
GetScreenData(x2,y2);
fx=fy=-1;
int xtmp=x1;
for(;y1<y2;y1++)
{
  for(x1=xtmp;x1<=x2;x1++)
   {
    if(GetScrPixel(x1,y1)==color)
    {
     fx=x1;
     fy=y1;
     ReleaseLP();
     return 1;
    }
   }
}
ReleaseLP();
return 0;
}
POINT FindFirstPoint(int x1,int y1,int x2,int y2)
{
int color=GetBmpPixel(0,0);
POINT pt;
pt.x=-1;
pt.y=-1;
int fx,fy,xtmp=x1;;
fx=fy=-1;
for(;y1<y2;y1++)
  for(x1=xtmp;x1<x2;x1++)
   {
    if(GetScrPixel(x1,y1)==color)
    {
     pt.x=x1;
     pt.y=y1;
     return pt;
    }
   }
return pt;
}

//比较屏幕pt点位图矩形大小的所有颜色和位置是否与位图相同
int Compare(POINT pt)
{
int x,y;
if((unsigned)bm.bmHeight>dwY-pt.y)return 0;
for(y=0;y<bm.bmHeight-1;y++)
{
  for(x=0;x<bm.bmWidth-1;x++)
  {
   if(GetBmpPixel(x,y)==GetScrPixel(pt.x+x,pt.y+y))
   {
   
   
   }
   else
   {
    return 0;
   }
  }
}
return 1;
}
//从数据char *lpBufscr中查找*lpBufbmp;
int FindBmpBuf(int x1,int y1,int x2,int y2,int &fx,int &fy)
{
POINT pt,pttmp;
fx=-1;
fy=-1;
pt=FindFirstPoint(x1,y1,x2,y2);
if(Compare(pt)){fx=pt.x;fy=pt.y;return 1;}

else//出现第一个点找到后却并不与位图吻合
  {
   pttmp.y=pt.y+1;
   while(pt=FindFirstPoint(pt.x+1,pt.y,x2,pt.y+1) ,pt.x>=0)
   {
    if(Compare(pt)){fx=pt.x;fy=pt.y;return 1;}
   }
   while(pt=FindFirstPoint(x1,pttmp.y,x2,y2) ,pt.x>=0)
   {
    if(Compare(pt)){fx=pt.x;fy=pt.y;return 1;}
    else
    {
     pttmp.y=pt.y+1;
     while(pt=FindFirstPoint(pt.x+1,pt.y,x2,pt.y+1) ,pt.x>=0)
      if(Compare(pt)){fx=pt.x;fy=pt.y;return 1;}
    }
   }
  }
return 0;
}
//从矩形x1,y1,x2,y2内查找与位图lpszName完全匹配的起始点
//若找到,(fx,fy)为图片第一次出现的左上角顶点,并返回1
//若找不到,(fx,fy)=(-1,-1)并返回0
int FindBmp(int x1,int y1,int x2,int y2,LPCTSTR lpszName,int &fx,int &fy)
{
GetBmpData(lpszName);
GetScreenData(x2,y2);
FindBmpBuf(x1,y1,x2,y2,fx,fy);
ReleaseLP();
if(fx>0)return 1;
return 0;
}
//比较屏幕pt点位图矩形大小的所有颜色和位置是否与位图条件匹配
//位图backcolor颜色点忽略,颜色偏差errorcolor,允许不匹配点的个数errorcount
//比较成功返回1,否则返回0
int CompareEx(POINT pt,int backcolor,int errorcolor,int errorcount)
{
int x,y,colorB,colorS,count=0;
if((unsigned)bm.bmHeight>dwY-pt.y)return 0;
for(y=0;y<bm.bmHeight-1;y++)
  for(x=0;x<bm.bmWidth-1;x++)
  {
   colorB=GetBmpPixel(x,y);
   colorS=GetScrPixel(pt.x+x,pt.y+y);
   if(colorB==colorS || colorB==backcolor);
   else
   {
    if( abs(GetRValue((COLORREF)colorB)-GetRValue((COLORREF)colorS) > GetRValue((COLORREF)errorcolor))
     || abs(GetGValue((COLORREF)colorB)-GetGValue((COLORREF)colorS) > GetGValue((COLORREF)errorcolor))
     || abs(GetBValue((COLORREF)colorB)-GetBValue((COLORREF)colorS) > GetBValue((COLORREF)errorcolor)) ){
     count++;
    }
   }
  }
if(count>errorcount)
  return 0;
else
  return 1;
}
//从矩形x1,y1,x2,y2内查找与位图lpszName条件匹配的起始点
//若有匹配的,(fx,fy)为图片第一次出现的左上角顶点,并返回匹配个数
//忽略位图backcolor颜色点,颜色偏差errorcolor,允许不匹配点的个数errorcount
int FindBmpEx(int x1,int y1,int x2,int y2,LPCTSTR lpszName,int backcolor,int errorcolor,int errorcount,int &fx,int &fy)
{
int x,y,color=-1;
GetBmpData(lpszName);
GetScreenData(x2,y2);
for(y=0;y<bm.bmHeight-1;y++)
{
  for(x=0;x<bm.bmWidth-1;x++)
   if(GetBmpPixel(x,y)!=errorcount)
   {
    color=GetBmpPixel(x,y);
    break;
   }
  if(color>0)break;
}
Points *head,*tail,*p,*q;
head=tail=NULL;
int xtmp=x1,countP=0,countB=0;
for(;y1<y2;y1++)
  for(x1=xtmp;x1<=x2;x1++)
   if(GetScrPixel(x1,y1)==color)
    {
     countP++;
     p=(struct Points *)malloc(sizeof(struct Points));
     (p->pts).x=x1-x;
     (p->pts).y=y1-y;
     if(head==NULL)q=head=tail=p;
     else
      tail=tail->next;
     tail->next=p;
    }
p->next=NULL;
while(q)
{
  if(CompareEx((q->pts),backcolor,errorcolor,errorcount))
  {
   countB++;
   if(countB==1)
   {
    fx=(q->pts).x;
    fy=(q->pts).y;
   }
  }
  p=q->next;
  free(q);
  q=p;
}
ReleaseLP();
return countB;
}
回复下载源文件
游客,如果您要查看本帖隐藏内容请回复




C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码

30

主题

116

帖子

186

金币

团长

Rank: 10Rank: 10Rank: 10

积分
408

初来乍到爱心论坛贵宾论坛帅哥小资土豪新兵论坛好爱者小熊

发表于 2014-7-6 20:52:07 | 显示全部楼层
瞧一瞧看一看~~
C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码

36

主题

88

帖子

88

金币

团长

Rank: 10Rank: 10Rank: 10

积分
270

初来乍到新兵

发表于 2014-8-1 16:01:22 | 显示全部楼层
{:3_41:}……………………………………………………
C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码
回复

使用道具 举报

7

主题

220

帖子

58

金币

师长

Rank: 13Rank: 13Rank: 13Rank: 13

积分
738

初来乍到小资土豪大享新兵论坛好爱者

发表于 2014-9-9 21:48:49 | 显示全部楼层
看看学习一下
C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码

16

主题

57

帖子

39

金币

连长

Rank: 7Rank: 7Rank: 7

积分
174

新兵

发表于 2014-9-26 11:37:28 | 显示全部楼层
看一看咯
C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码
回复

使用道具 举报

10

主题

87

帖子

51

金币

团长

Rank: 10Rank: 10Rank: 10

积分
288

初来乍到新兵

发表于 2014-10-3 19:45:06 | 显示全部楼层
调用方法?
C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码
回复

使用道具 举报

10

主题

62

帖子

23

金币

团长

Rank: 10Rank: 10Rank: 10

积分
222

初来乍到小资新兵论坛好爱者社区QQ达人

发表于 2014-10-15 23:31:37 | 显示全部楼层
必需支持啊··
C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码

9

主题

90

帖子

55

金币

团长

Rank: 10Rank: 10Rank: 10

积分
312

社区QQ达人新兵论坛好爱者

发表于 2014-10-16 17:38:30 | 显示全部楼层
看看里面藏的什么
C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码

33

主题

40

帖子

147

金币

VIP会员

积分
179

初来乍到新兵

发表于 2014-11-29 18:07:24 | 显示全部楼层

C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码
回复

使用道具 举报

27

主题

62

帖子

77

金币

连长

Rank: 7Rank: 7Rank: 7

积分
180

新兵

发表于 2014-12-10 17:00:05 | 显示全部楼层
正需要,谢谢海岸。
C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

豫ICP备14012807号-2|小黑屋|联系客服|金币冲值|VC中文网

GMT+8, 2021-3-1 18:45 , Processed in 0.117188 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表