http://blog.csdn.net/pipisorry/article/details/46564967

找茬游戏地址[美女大家来找茬]

游戏窗口探查

下载安装PyWin32库(对windows接口的Python封装)http://sourceforge.net/projects/pywin32/,但不能直接点Download图标,不然下下来是一个Readme.txt,点“Browse All Files”寻找需要的版本。

使用spy++找到窗口句柄(或者找到窗口类名lpClassName和窗口名lpWindowName)[python指定窗口截图-spy++用法]

hwnd = win32gui.FindWindow("MozillaWindowClass", "游戏全屏 - Mozilla Firefox")
if not hwnd:
    print(RED, 'window not found!', DEFAULT)
else:
    print(hwnd)
# hwnd = 918912  #或者直接使用句柄

Note:

1. FindWindow函数:

FindWindow这个函数检索处理顶级窗口的类名和窗口名称匹配指定的字符串。这个函数不搜索子窗口。

函数功能:该函数获得一个顶层窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数不查找子窗口。在查找时不区分大小写。
函数型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);
参数:
    IpClassName :指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位,必须位于IpClassName的低16位,高位必须为0。
    IpWindowName:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为空,则为所有窗口全匹配。
    返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL。

[FindWindow用法]

[findwindow-baike.baidu]

2. 句柄

直接使用句柄可能的问题:

1)firefox中每个页面tab都是同一个句柄,程序中找到的句柄对应当前tab,如果当前tab不是找茬游戏就不对了

2)使用窗口类名lpClassName和窗口名lpWindowName时如果当前tab不是找茬游戏会找不到相应句柄

上面问题一个有效的解决方法是将找茬游戏单独在新窗口中打开

也可以使用spy++反向从句柄找到句柄对应窗口,检查是否正确。

游戏图片提取

提取图片采用了截屏的方式,找到窗口后将窗口提到最前,再作窗口截屏。

下载安装PIL图形处理库[linux和windows下安装python拓展包-...PIL、pythonqt...]

win32gui.ShowWindow(hwnd, win32con.SW_MAXIMIZE)  # 强行显示界面后才好截图,SW_RESTORE初始大小
win32gui.SetForegroundWindow(hwnd)  # 将窗口提到最前
# 裁剪得到全图
game_rect = win32gui.GetWindowRect(hwnd)
# src_image = ImageGrab.grab(game_rect)
src_image = ImageGrab.grab((game_rect[0] + 20, game_rect[1] + 176, game_rect[2] - 523, game_rect[1] + 176 + 514))
# src_image.show()
width, hight = src_image.size
# 分别裁剪左右内容图片
left_box = (0, 0, width // 2 + 1, hight)
right_box = (width // 2 + 1, 0, width, hight)
image_left = src_image.crop(left_box)
image_right = src_image.crop(right_box)
# image_left.show()
# image_right.show()

Note:

1.win32gui.GetWindowRect函数

l,t,r,b =win32gui.GetWindowRect(self.hwnd)    #返回图形左、上、右、下边界(或者说是左上、右下的坐标点)

2.ImageGrab.grab函数:ImageGrab是PIL的一个模块,用于图像的抓取。不带参数的ImageGrab.grab()进行全屏截屏,返回一个Image对象,也可使用一个元组作为参数指定要截取的范围(左上与右下两点的坐标),这两种截屏都是不带鼠标指针的。

上面用到的坐标都为为了演示代码简单填的,实际上可使用了变量参数,而且要区分分辨率什么的。

还有一个ImageGrab.grabclipboard()可从系统剪贴板采集图像。

3. 得到Image图像后可用show()方法,使用系统默认的图像查看工具打开,方便调试。

也可以用save(filename)保存成文件,对应的可以Image.open(filename)打开获得。

4. crop(box)方法:参数为左上和右下标点坐标(或者说是左、上、右、下边界)

grab得到了一个包含左右图片的Image对象后,用crop(box)方法可裁剪得到其中指定的区域,分别拿到左右两个游戏图片。

对比获得两图内容不同的区域

把两图裁剪成N个小图片分别对比,左右统一区域对应的小图片不相等则为“茬”区,问题是怎么判断两个图片内容不一致?

Image.histogram()函数:用于得到图像的颜色直方图。直方图可以表示一张图片中各种亮度(或颜色)的数量,两张自然图片的直方图基本是不一样的,除非两图对称、颜色一致但排列不一,但就算如此,将两图继续分割下去,其子图的直方图也会不一样。直方图就是一种图形到数值的转换,对比两图的颜色数值就可知是否存在差异。一张用RBG颜色格式的图像,histogram()函数将返回一个长度为768的数组,第0-255表示红色的0-255,第256-511表色绿色的0-255,第512-767表色蓝色的0-255,数值表示该颜色像素的个数。因此,histogram()列表所有成员之和等于改图像的像素值 x 3。

用来获得两图比较的数值差的函数

def channel_compare(cha_a, cha_b):
    '''
    比较两个颜色通道的差异值并返回
    '''
    sum_a = sum([i * v for i, v in enumerate(cha_a)])sum_b = sum([i * v for i, v in enumerate(cha_b)])# red_a = 0
    # red_b = 0
    # for i in range(0, 256):
    # red_a += histogram_a[i + 0] * i
    # red_b += histogram_b[i + 0] * i
    if sum_a + sum_b > 0:
        diff_channel = abs(sum_a - sum_b) * 10000 / max(sum_a, sum_b)return diff_channeldef image_compare(image_a, image_b):
    '''
    返回两图的差异值, 返回两图红绿蓝差值万分比之和
    '''
    histogram_a = image_a.histogram()histogram_b = image_b.histogram()if len(histogram_a) != 768 or len(histogram_b) != 768:
        print(RED, "get histogram error", DEFAULT)return None
    print([i * v for i, v in enumerate(histogram_a)][0:10])diff_red = channel_compare(histogram_a[:256], histogram_b[:256])diff_green = channel_compare(histogram_a[256:512], histogram_b[256:512])diff_blue = channel_compare(histogram_a[512:768], histogram_b[512:768])return diff_red, diff_green, diff_blue

Note:将函数返回的红绿蓝差值相加,如果超过了预定定的阀值2000,则表示该区域不同。这个计算方式有点“土”,但对这次要解决的问题很有效,就没再继续改进。

把两图裁剪成N个小图片分别对比

# 将左右大图裁剪成多个小图分别进行对比
result = zeros((width // 10, hight // 10))
for col in range(0, width // 10):
    for row in range(0, hight // 10):
        clip_box = (col * 10, row * 10, (col + 1) * 10, (row + 1) * 10)clip_image_left = image_left.crop(clip_box)clip_image_right = image_right.crop(clip_box)clip_diff = image_compare(clip_image_left, clip_image_right)if sum(clip_diff) > 2000:
            result[row][col] = 1

Note:大图是 780*520,分隔成10x10的小块,定义一个78*52的二位数组存储结果,分别比较后将差值大于阀值的数组区域标记为1.

在游戏上标记两边不同的区域

可以使用PyWin32的函数,获得游戏窗口句柄后直接在上面绘制,但要熟悉Windows编程,解决游戏自身重绘后将我的标记擦除的问题。

也可以使用Qt。下面用Qt创建了一个和游戏大小一样透明的QWidget窗口,叠加在游戏窗口上,用遮罩来绘制标记。标记数据已记录在result数组中,在指定的位置绘制一个方格则表示该区域左右不同,要注意两个方格间的边界不要绘制,避免格子太多干扰了游戏。除标记外,还绘制了两个按钮来触发对比与擦除。

Note:

1. 这里没有替换变量,清楚算法就行。

2. The QPixmap class is an off-screen image representation that canbe used as a paint device.

from: http://blog.csdn.net/pipisorry/article/details/46564967

ref:PIL Document

用Python实现QQ找茬游戏外挂工具

直方图均衡化

python计算机视觉1:基本操作与直方图

pyQT实现自动找茬游戏相关推荐

  1. 找茬游戏中是如何设计两个图片的不同之处的

    使用程序自动生成不同是一件几乎不可能的任务 因此找茬游戏的图片还是需要作者自己PS 但是一对图只能使用一次实在是太浪费了 今天看了下Win8版的美女找茬的文件结构 搞清楚了他们的设计 首先处理图片 在 ...

  2. 比较不错的一个ios找茬游戏源码

    找茬游戏源码 ,这个是一款非常不错的ios找茬游戏源码,该游戏的兼容性非常好的,并且还可以支持ipad和iphone,UI界面设计得也很漂亮,游戏源码真的是一款非常完美,而且又很完整的一款休闲类的游戏 ...

  3. 由于找不到appvisvsubsystems32.dll_找茬游戏大全:我找东西贼快!小清新找茬游戏小程序,点开既玩...

    50000+游戏爱好者已加入我们! 每天推荐好玩游戏! 关注我们,沐沐带你发现好游戏! <我找东西贼快>游戏小程序好玩吗? <我找东西贼快>小游戏怎么玩? 怎么进入<我找 ...

  4. “QQ找茬”游戏的识别小软件JAVA源码

    "QQ找茬"游戏识别很简单,只包含查找定位.定位比较和显示三部分,作者设计两个类: 1.GUI类:frmZC类,包含"定位"和"查询"两个按 ...

  5. 动手制作QQ找茬游戏外挂

    周末闲来无事,玩了腾讯的qq游戏,名字叫大家来找茬,游戏就是在两幅相同的图片寻找不同五处不同的地方,你和对手谁发现的快就赢,无奈自己眼睛不够尖,总是比对手慢,好在俺是名程序员,只好想点别的办法,一直都 ...

  6. 大家来找茬游戏助手、外挂的实现

        在家陪女女打游戏'大家来找茬',老是输,让哥心里很窝火,于是想到了作弊,嘿嘿,说干就干,我用的是最笨的方法,首先FindWindow找到'大家来找茬'的位置,然后根据计算好的相对位置,截取两幅 ...

  7. 找茬游戏小程序源码(可开流量主)无授权可二开

    介绍: 找茬小程序 功能介绍 一共有2510关, 达到高级后会随机出现关卡 一共7个能量, 每闯关一次扣除一个能量值, 看激励视频可以获得一个能量值. 金币获取: 段位升级 或者 观看激励视频, 闯关 ...

  8. 纯AS3.0制作的美女找茬游戏

    废话不多说,直接上代码 package action { import fl.controls.Button; import flash.display.Loader; import flash.di ...

  9. 图片找茬游戏——使用OpenCV查找两张图像的不同处并标记

    前言 有个小游戏,就是给出两张只有轻微的几处差异的图像,让大家来找出图像中的不同之处,之前曾经玩过,发现游戏明明告诉你有几处不同,但你什么也找不全,比如下面的几组图像,这几组图像每组都有三个不同的地方 ...

  10. “QQ找茬”游戏的识别小软件JAVA源码(netBeams项目)

    1.此为一个netBeams项目; 2.它包frmZC和funChk两个类: 3.采用技术有截屏.线程和识别方案: 4.它是个完整可运行和可使用的小软件: 5.它可能会被腾讯公司认为是外挂. http ...

最新文章

  1. http超文本传输协议的http头部分析
  2. 【网络流】Modular Production Line
  3. 文本模式下的分辨率对照表
  4. MongoDB实战(7)索引与性能
  5. C和指针之数组编程练习5 (矩阵相乘)
  6. java 鼠标画多个圆形_点击鼠标不同的建(左、中、右)画一个不同颜色的圆
  7. SpringBoot 07 之JPA使用
  8. 学号:201621123032 《Java程序设计》第3周学习总结
  9. iOS优化内存,提升性能 之五
  10. php round函数输出不对_PHP第一章-变量
  11. mac上配置rails开发环境
  12. 浅谈NB-IOT模块调试
  13. win10QQ语音无法使用麦克风
  14. 基于SpringBoot的抽奖系统
  15. 大数据安装之hadoop-3.3.4
  16. re模块与正则表达式 1
  17. iphone有关QQ和微信无法收到推送通知的终极解决方案
  18. kodi 下载插件失败/无法刮削
  19. 面试官:什么是 Reactor 和 Proactor?
  20. slg游戏客户端框架简析

热门文章

  1. ViewPager,使用Fragment实现
  2. XPath 元素及属性查找
  3. linux中vim中文显示乱码
  4. FFPLAY的原理(三)
  5. SDUT1500Message Flood(字典树)
  6. 关于64位win7环境下VS连接oracle数据库的问题
  7. shell将输入的参数逆序
  8. jq中的get()和eq()的区别
  9. Oracle命令--查询语句
  10. HDOJ 3507 Print Article(DP + 斜率优化)