昨天不用加班,闲来无事,玩了几把大家来找茬。可惜眼力不够,总是找不出来,心想能不能写个外挂,帮忙找出在哪里。
在网上搜了一下,大体上也有一些利用python,计算来找茬的外挂。
本人python基础比较弱,特别是图像一方面的,能够会调用几个API就不错了。
首先,其实找茬就是核心利用python比较两个图片不同就行了。网上一个大神利用opencv搞出一个外挂,貌似很牛逼,可惜还是上面一句话,对于我等学渣,会调用api就不错了。opencv那么难的东西,就不是我能涉及的了。
第一步,肯定是要查找 找茬的窗口的句柄。
这里,网上相关的介绍还是比较多的,主要就是用到FindWindow来找到句柄。
import win32gui
import win32con
game_hwd = 0
while game_hwd == 0:
game_hwd = win32gui.FindWindow("#32770","大家来找茬")
if game_hwd:
break
time.sleep(2)
这样能够保证 获取到找茬窗口的句柄。
第二步就是抠图了
这里使用到ImageGrab,可以抓取屏幕上的图片。具体使用大家可搜一下。
这里关键就是两张图片不好定位。没办法,用最挫的方法,首先将窗体整张图给grab下来,然后沿着中间进行分开,也就是分成左右两部分,分别记为ima和imb。ima和imb现在还不能直接进行比较。还必须将边沿给去掉,怎么去掉呢,我用最挫的方法,就是用QQ截图,然后大致看边沿里图像有多少像素,然后将边沿去掉。
下图是游戏中的两张图片。
下面是实际运行时,得到的结果。
还是需要人工自己在原来图片上进行对照,比较麻烦。
下面是完整的程序
#coding=gbk
import win32gui
import time
import Image
import ImageChops
import win32con
from PIL import ImageGrab
#s=u"´ó¼ÒÀ´ÕÒ²ç"
game_hwd = 0
while game_hwd == 0:
game_hwd = win32gui.FindWindow("#32770","´大家来找茬")
if game_hwd:
break
time.sleep(2)
win32gui.ShowWindow(game_hwd,win32con.SW_RESTORE)
win32gui.SetForegroundWindow(game_hwd) #强制将窗口放置最前面
game_rect = win32gui.GetWindowRect(game_hwd) #获取窗体的矩形坐标
#print game_rect
width = game_rect[2] - game_rect[0]
height = game_rect[3] - game_rect[1]
rect1 = (game_rect[0]+55,game_rect[1],game_rect[0]+width/2,game_rect[3]-100) #沿中线分开,+55是因为去掉图像的左边沿
rect2 = (game_rect[0]+width/2,game_rect[1],game_rect[2]-55,game_rect[3]-100) #沿中线分开,-55是因为去掉图像的右边沿
#具体的这个55,完全要根据自己的机器运行的实际情况,其实主要就是分辨率,我是通过QQ截图,然后数出来的这个值
ima = ImageGrab.grab(rect1)
imb = ImageGrab.grab(rect2)
#ima.show()
#imb.show()
#out.show()
out = ImageChops.difference(ima,imb) #比较两幅图
out.show()
大家后续可以将这个图的差值,进行一系列的转换,然后再加到原来的图片中,只需要差值能够在原图中明显就可以了。
现在没更新一张图,都要重新将脚本运行一遍,后续再改进。