前几天在验证python自动化办公的时候 ,遇到了一个好玩的事情 :登录某网站的时候需要拖动图片做一下验证,然后西瓜了一下搜索,居然找到了答案!
他的验证原理是 取得拖动的图标 和 背景图片,利用python的PIL库对背景图片进行像素的RGB信息分析,找到差异点从而计算出需要移动的距离 。
然后就想到,既然通过PIL库能取得到图片的所有RGB信息,图片又是由每个RGB不一样的像素组成,那岂不是可以通过RGB信息就可以还原了这张图片呢。
半天时间测试了一下,是可以的,而且还可以在原RGB信息的基础上通过修改RGB参数生成比较有个性的一张新图片。
代码展示:
完整代码:
from PIL import Image
import os
import random
import time
class Photo():
def __init__(self,img,txt,imgNew,isRandomColor):
self.img = img
self.txt = txt
self.imgNew = imgNew
self.isRandomColor = isRandomColor
# 获取图片宽高
def getImgInfo(self):
self.im = Image.open(self.img)
self.width = self.im.size[0] self.height = self.im.size[1]
# 取得图片RGB信息并保存到txt文件
def setRgbToTxt(self):
txt = open(self.txt,"w")
for i in range(0,self.width): for r in range(0,self.height):
v = self.im.getpixel((i,r)) txt.write(v.__str__().replace('(','').replace(")","") + "") # print(i,r,v)
txt.close()
#创建新图片
def createNewPicByRgb(self):
im = Image.new("RGB", (self.width, self.height))
txt = open(self.txt)
num = random.randint(50,100)
for i in range(0,self.width):
for r in range(0,self.height):
line = txt.readline() rgb = line.split(", ")
red = int(rgb[0]) + num if self.isRandomColor else rgb[0]
green = int(rgb[1]) + 0 if self.isRandomColor else rgb[1]
blue = int(rgb[2]) + 0 if self.isRandomColor else rgb[2]
im.putpixel((i, r), (int(red), int(green), int(blue)))
im.save(self.imgNew)
im.show()
m.close()
# 删除多余文件
def deleteTxt(self):
if os.path.exists(self.txt):
os.remove(self.txt)
def __del__(self):
print("操作完成")
if __name__ == "__main__":
PATH = os.getcwd() PATH_DATA = os.getcwd() + r"data"
img = PATH_DATA + r"imagesest.jpg"
txt = PATH_DATA + r"imagesest.txt"
imgNew = PATH + r"dataimages%s.jpg" %(time.time())
isRandomColor = True
photo = Photo(img,txt,imgNew,isRandomColor)
photo.getImgInfo()
photo.setRgbToTxt()
photo.createNewPicByRgb()
photo.deleteTxt()
看一下效果: