1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 原文
0000000001110010000000000
0000000000011110100000000
0000000001110001000000000
0000000010111100000000000
0000000010101010000000000
0000000001100010100000000
0000000010101010100000000
0000000001000001100000000
1100011101110110100011000
0001000010110010010010100
0100111101000011101110011
0011110100101011001001001
1000001001100001001101000
1111000111111011100101000
1011011111001101111110111
1000110110010010101101100
1000111100111111111110111
0000000010110001100010100
0000000010010100101010001
0000000010101010100011001
0000000000100111111110010
0000000000011001011110111
0000000001001100100100001
0000000011000011011011001
0000000011010000101110101

  • 一眼看上去是黑白(01)图片

  • 先编程生成图像看看

  • 读取文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    def read_file(path):
        data_list = []
        with open(path,"r+") as f:
            while True:
                line = list(f.readline()[:-1])
                if not line:
                    break
                data_list.append(line)
        return data_list
  • 生成csv文件

    1
    2
    3
    4
    5
    6
    def save_data(data_list,path):
        with open(path,"w+",encoding="utf-8") as f:
            for data in data_list:
                data = ",".join(data)
                f.write(data)
                f.write("\n")
  • 将csv用pandas读入生成图片

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import numpy as np
    import pandas as pd
    from imageio import imsave
    from PIL import Image

    def ArrayToPicture():
        names = [i for i in range(25)]
        train_data = pd.read_csv("./1and0.csv",names=names)
        data = train_data
        data = np.matrix(data)
        print(data)
        data = np.reshape(data,(25,25))
        imsave("2.png",data)
  • 25x25的图片

    • avatar
  • 像二维码,但少了标志位,并且黑白区是反的,可看右下角的小黑框发现

  • 然后对01互换,加上标志位

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49

    def read_file(path):
        data_list = []
        with open(path,"r+") as f:
            while True:
                line = list(f.readline()[:-1])
                if not line:
                    break
                len_l = len(line)
                for i in range(len_l):
                    if line[i] == "0":
                        line[i] = "1"
                    else:
                        line[i] = "0"
                data_list.append(line)
        return data_list

    def deal_data_list(data_list):
        if data_list[0][0] == "1":
            for i in range(7):
                data_list[0][i] = "0"
                data_list[6][i] = "0"
                data_list[i][0] = "0"
                data_list[i][6] = "0"
            for j in range(3):
                data_list[2+j][2] = "0"
                data_list[2+j][3] = "0"
                data_list[2+j][4] = "0"
        if data_list[0][-1] == "1":
            for i in range(1,8):
                data_list[0][-i] = "0"
                data_list[6][-i] = "0"
                data_list[i-1][-1] = "0"
                data_list[i-1][-7] = "0"
            for j in range(3):
                data_list[2+j][-5] = "0"
                data_list[2+j][-4] = "0"
                data_list[2+j][-3] = "0"
        if data_list[-1][0] == "1":
            for i in range(7):
                data_list[-1][i] = "0"
                data_list[-7][i] = "0"
                data_list[-i-1][0] = "0"
                data_list[-i-1][6] = "0"
            for j in range(3):
                data_list[-3][2+j] = "0"
                data_list[-4][2+j] = "0"
                data_list[-5][2+j] = "0"
        return data_list
  • 测试成功

    • avatar
  • 接着再研究了下,相关的函数,发现了更好的实现方法,这方法是完全懂了后才好写出来的

  • https://blog.csdn.net/qq_43528553/article/details/119084941

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    from PIL import Image
    with open("1and0.txt", "r") as f:
        # strip以换行切割
        data = [list(i.strip()) for i in f.readlines()]
    # 7*7的定位标志
    flag = [
        [1, 1, 1, 1, 1, 1, 1],
        [1, 0, 0, 0, 0, 0, 1],
        [1, 0, 1, 1, 1, 0, 1],
        [1, 0, 1, 1, 1, 0, 1],
        [1, 0, 1, 1, 1, 0, 1],
        [1, 0, 0, 0, 0, 0, 1],
        [1, 1, 1, 1, 1, 1, 1]
    ]
    img = Image.new("1", (25, 25))
    for i in range(len(data)):
        for j in range(len(data[1])):
            # 左上角定位标志
            if i < 7 and j < 7:
                # putpixel(self, xy, color), 修改(i,j)的颜色为,flag[i][j]^1, ^异或,对原数据的01互换
                img.putpixel((i, j), flag[i][j] ^ 1)
            # 左下角定位标志
            elif i > 17 and j < 7:
                img.putpixel((i, j), flag[i-18][j] ^ 1)
            # 右上角定位标志
            elif i < 7 and j > 17:
                img.putpixel((i, j), flag[i][j-18] ^ 1)
            else:
                img.putpixel((i, j), int(data[i][j]) ^ 1)
    # resize 大小变为 500x500
    img.resize((500, 500)).show()