python 根据图片的相似度破解关卡
发现一个好玩的游戏,但是游戏关卡被加密了。根据图片颜色获取关卡信息。#!/usr/bin/python# -*- coding: utf-8 -*-import Imagedef make_regalur_image(img, size = (256, 256)):return img.resize(size).convert('RGB')def split_image(
·
发现一个好玩的游戏,但是游戏关卡被加密了。
根据图片颜色获取关卡信息。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import Image
def make_regalur_image(img, size = (256, 256)):
return img.resize(size).convert('RGB')
def split_image(img, part_size = (64, 64)):
w, h = img.size
pw, ph = part_size
imgArray = []
for i in range(94, 478, pw):
for j in range(475, 987, ph):
imgCopy = img.crop((i, j, i+pw, j+ph)).copy()
imgCopy.name = str(i)+'x'+str(j)+'x'+str(pw)+'x'+str(ph)
imgArray.append(imgCopy)
return imgArray
def hist_similar(lh, rh):
assert len(lh) == len(rh)
return sum(1 - (0 if l == r else float(abs(l - r))/max(l, r)) for l, r in zip(lh, rh))/len(lh)
def calc_similar(li, ri):
return hist_similar(li.histogram(), ri.histogram())
# return sum(hist_similar(l.histogram(), r.histogram()) for l, r in zip(split_image(li), split_image(ri))) / 16.0
def calc_similar_by_path(lf, rf):
li, ri = make_regalur_image(Image.open(lf)), make_regalur_image(Image.open(rf))
return calc_similar(li, ri)
if __name__ == '__main__':
#单个小图的大小
size = (64,64)
rImg = Image.open(r'1.jpg')
yImg = Image.open(r'2.jpg')
bImg = Image.open(r'3.jpg')
gImg = Image.open(r'4.jpg')
desArray = [rImg,yImg,bImg,gImg]
#单个更小的图 右上角
l_rImg = Image.open(r'_11.jpg')
l_yImg = Image.open(r'_22.jpg')
l_bImg = Image.open(r'_33.jpg')
l_gImg = Image.open(r'_44.jpg')
l_desArray = [rImg,yImg,bImg,gImg]
#文字图片 标记是什么颜色
t_rImg = Image.open(r'11.png')
t_yImg = Image.open(r'22.png')
t_bImg = Image.open(r'33.png')
t_gImg = Image.open(r'44.png')
fontImgArray = [t_rImg,t_yImg,t_bImg,t_gImg]
deColor = ['红','黄','蓝','绿']
fileArray = [(14,39),(115,190)]
#一共100个文件
allGirdInfo = []
# fileArray = [(14,15),(115,115),(1,1)]
filenum = 0
for fileIndex in range(0,2):
for iPath in range(fileArray[fileIndex][0],fileArray[fileIndex][1]):
# 输出数据9行6列 第9行表示最上 右边小上 右边小下 6个数据
girdArray = [([0] * 6) for i in range(9)]
filenum = filenum + 1
print '['+str(iPath)+']'+'='*100
imgIndex = 0
path = 'IMG_50%d.PNG'%(iPath)
if fileIndex == 1:
path = 'IMG_5%d.PNG'%(iPath)
print str(fileIndex)+" " + str(iPath)
img = Image.open(path)
w,h = img.size
#输出图片内容
canvas = Image.new("RGB", (2*w,h), "white")
#左半部分是原图
canvas.paste(img,(0,0,w,h))
# 右半部分是计算过的图 进行比对
rightCanvas = Image.new("RGB", (w,h), "white")
rightImg = Image.open(r'IMG_5190.PNG')
rightCanvas.paste(rightImg,(0,0,w,h))
for sImg in split_image(img,size):
linestr = str(imgIndex)
sImg.save(sImg.name+'.jpg')
newSImg = Image.open(sImg.name+'.jpg')
preResult = 0
dIndex = 0
for dImg in desArray:
result = calc_similar(newSImg.convert('RGB'), dImg.convert('RGB'))*100
linestr = linestr + 'test_case_%s: %.3f%%'%(deColor[dIndex], result)+' '
# 超过40%并且要大于之前超过的相似度
if result > 40 and preResult < result:
row = 7 - imgIndex % 8
col = imgIndex / 8
print '[row:'+str(row)+'] [col:' + str(col) + '] [index:' + str(dIndex+1)+ '] [imgIndex:'+str(imgIndex)+']'
girdArray[row][col] = dIndex+1
preResult = result
infoArray = sImg.name.split('x')
l = int(infoArray[0])
b = int(infoArray[1])
t = l + int(infoArray[2])
r = b + int(infoArray[3])
box = (l,b,t,r)
rightCanvas.paste(fontImgArray[dIndex],box)
dIndex = dIndex + 1
print linestr
imgIndex = imgIndex + 1
del sImg
#同上 计算小图和最顶上的图
otherImgArray = [(222,284,64,64),(286,284,64,64),(521,330,48,48),(568,330,48,48),(521,395,48,48),(569,395,48,48)]
otherCropArray = []
otherIndex = 0
for boxInfo in otherImgArray:
otherImgCopy = img.crop((boxInfo[0], boxInfo[1], boxInfo[0]+boxInfo[2], boxInfo[1]+boxInfo[3])).copy()
otherImgCopy.name = str(boxInfo[0])+'x'+str(boxInfo[1])+'x'+str(boxInfo[2])+'x'+str(boxInfo[3])
linestr = '-'*10+str(imgIndex)
otherImgCopy.save(otherImgCopy.name+'.jpg')
newSImg = Image.open(otherImgCopy.name+'.jpg')
preResult = 0
newDesArray = desArray
otherIndex = otherIndex+1
if otherIndex > 2 :
newDesArray = l_desArray
dIndex = 0
for dImg in newDesArray:
infoArray = otherImgCopy.name.split('x')
l = int(infoArray[0])
b = int(infoArray[1])
box_w = int(infoArray[2])
box_h = int(infoArray[3])
result = calc_similar(newSImg.convert('RGB'), dImg.resize((box_w,box_h)).convert('RGB'))*100
linestr = linestr + 'test_case_%s: %.3f%%'%(deColor[dIndex], result)+' '
if result > 34 and preResult < result:
row = 8
col = imgIndex % 8
girdArray[row][col] = dIndex+1
preResult = result
box = (l,b,l+box_w,b+box_h)
rightCanvas.paste(fontImgArray[dIndex].resize((box_w,box_h)),box)
dIndex = dIndex + 1
print linestr
imgIndex = imgIndex + 1
del newSImg
canvas.paste(rightCanvas,(w,0,2*w,h))
canvas.save('__'+str(iPath)+'.PNG')
# canvas.show()
del img
del rightCanvas
del canvas
allGirdInfo.append(girdArray)
print str(len(allGirdInfo))+'|'*100
f=file("level.txt","a+")
newdeColor = ['空','红','黄','蓝','绿']
arrayIndex = 0
jsonStr = '{'
for array in allGirdInfo:
arrayIndex = arrayIndex + 1
print arrayIndex
resultStr = '\"level'+str(arrayIndex)+'\":['
for i in range(9):
resultStr = resultStr + '\"'
for j in range(6):
# resultStr = resultStr + ' ['+newdeColor[array[i][j]]+'] '
endStr = ','
if j == 5 :
endStr = '\",'
if i == 8:
endStr = '\"],'
resultStr = resultStr + str(array[i][j]) + endStr
# resultStr = resultStr + '\n'
jsonStr = jsonStr + resultStr
print resultStr
jsonStr = jsonStr + "}"
print jsonStr
f.write(jsonStr)
f.close()
更多推荐
所有评论(0)