给了一张图片
思路:猫眼睛向左为1,向右为0,将得到的0和1转换为二维码,读取二维码中的信息,得到flag
import zxing
from PIL import Image
def split_image(image_path, rows, cols): # 获得一个小图片的列表
image = Image.open(image_path) # 打开图片
width, height = image.size # 获取图片的宽度,高度
cell_width = width // cols # 获取小图片的宽度
cell_height = height // rows # 获取小图片的高度
small_images = [] # 创建一个存储小图片的列表
for y in range(rows): # 获取每个小图片
for x in range(cols):
left = x * cell_width
upper = y * cell_height
right = left + cell_width
lower = upper + cell_height
small_image = image.crop((left, upper, right, lower)) # crop()函数来裁剪小图片
small_images.append(small_image)
return small_images # 返回小图片列表
def compare_images(base_image, comp_image): # 与第一张对比,相同则为1,不同则为0
pixels1 = list(base_image.getdata()) # getdata()方法来获取图像的像素数据
pixels2 = list(comp_image.getdata())
if pixels1 == pixels2:
return '1'
else:
return '0'
def generate_string(images): # 获得0和1的字符串数组
base_image = images[0] # 用第一个作为对比的小图片
string = '' # 创建一个用来存储0和1的小图片
for i in range(0, len(images)): # 循环对比
comparison = compare_images(base_image, images[i])
string += comparison
return string
image_path = "C:\\Users\\86158\\Desktop\\RE-NO_1\\ez_png.png" # 图片路径
rows = 29
cols = 29
small_images = split_image(image_path, rows, cols)
result_string = generate_string(small_images)
# print(result_string)
MAX = 29
i = 0
pic = Image.new("RGB", (MAX, MAX)) # new()函数创建一个新的空白图像
for y in range(0, MAX):
for x in range(0, MAX):
if result_string[i] == '1':
pic.putpixel((x, y), (0, 0, 0))
else:
pic.putpixel((x, y), (255, 255, 255))
i += 1
# pic.show()
pic.save("C:\\Users\\86158\\Desktop\\RE-NO_1\\flag.png") # 保存生成的二维码
reader = zxing.BarCodeReader() # 创建条形码读取器对象
barcode = reader.decode("C:\\Users\\86158\\Desktop\\RE-NO_1\\flag.png") # 读取图像并解码条形码
print(barcode.parsed)