2023ciscn-misc-国粹复现

发布时间 2023-05-29 20:12:22作者: dai呆

说明:此题给出的两个图片,a.png及k.png是分别表示的x坐标和y坐标。然后再用此坐标对题目进行画图,从而得出flag

但是由于本人的代码技术有限只能借鉴大佬们的代码然后对其进行分析学习。

import numpy as np
from PIL import Image
 
class test():  
    def __init__(self):
        self.a = np.array(Image.open("C:\\Users\\Redmi\\Desktop\\国粹\\a.png"))
        self.k = np.array(Image.open('C:\\Users\\Redmi\\Desktop\\国粹\\k.png'))
        self.img = np.array(Image.open('C:\\Users\\Redmi\\Desktop\\国粹\\题目.png'))
        self.img_make()  
        self.dic()    #字典化
 
    def img_make(self):
        lst_img = self.img.shape  #shape的含义就是将其中表明这个有几个数组,是几行几列的
        self.part = (lst_img[0] // 2, lst_img[1] // 43, lst_img[2])  #第一个参数表示数组数量除以二,然后第二个参数行除以43,第三个参数就是列了
 
    def dic(self):
        dic = {}   #创建一个空字典
        for n, x in enumerate(range(self.part[1], self.img.shape[1], self.part[1])):   #首先看range...讲实话没看懂为什么要这样做。
            dic[self.img[0:self.part[0], x:x + self.part[1], :self.part[2] - 1].tobytes()] = n
        self.a = [dic[self.a[:, x:x + self.part[1]].tobytes()] for x in range(0, self.a.shape[1], self.part[1])]
        self.k = [dic[self.k[:, x:x + self.part[1]].tobytes()] for x in range(0, self.k.shape[1], self.part[1])]
        result = np.zeros((max(self.a), max(self.k)), dtype=np.uint8)
        result[np.array(self.a) - 1, np.array(self.k) - 1] = 1
        resimg = Image.fromarray(result * 255)
        resimg.show()
 
if __name__ == "__main__":
    test()
    #寄,以后再来看,看锤子,看不明白

来源:2023第十六届全国大学生信息安全竞赛(CISCN) 初赛 WriteUp By F61d (qq.com)