发现一个好玩的游戏,但是游戏关卡被加密了。

根据图片颜色获取关卡信息。

#!/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()


Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐