今天就是七夕了,曉得大家有對象的或者正在追妹子的,確定又在絞盡腦汁想買什麼別出新裁的禮物,若是女生感受你的禮物花心思了,那確定是好感度倍增啊。markdown
下面就來講說,怎麼製做這個禮物。app
簡單來講就用一張A4紙,打印個表格,嗯,表格是幹啥用?其實就是手繪二維碼,固然二維碼內容你懂得,利用的下面這個手繪二維碼app,會分紅格子,提示你哪一個塗黑。▼學習
不過,這種套路貌似被用濫了。spa
因此今天說的這個明顯是手繪二維碼的升級版,成本依然是一毛錢,不只你要費心思,女孩也要去費心思,這樣纔好玩嘛。code
**來,咱們一步一步來,咱們先說說數織這個遊戲,而後你就知道大概用意了。**數織(nonogram)是日本人的數獨遊戲。orm
以下是數織的規則,簡單易懂。分行和列,行和列都標記了一些數字,好比下圖的第一行7 1 2 7,表明第一行有四條獨立的線,分別佔了七、一、2和7格,而每條線最少要由一個空格分開。對象
傳統上,玩家是以黑色填滿格子,以**「×」號標記必定不須要填充的格子****。因此聰明的你確定就會知道第一列7 1 1 1 7表明什麼意思。**▼遊戲
因此數織就是以下這樣玩,給你的圖片只有行列數字,格子須要本身根據規則塗黑,因此你也知道了,咱們作的就是下面的圖,將二維碼隱藏其中。讓女孩塗黑,掃碼便可。圖片
「製做隱藏二維碼的數織圖」get
你說怎麼作出上圖呢?
對於笨辦法,就是開頭說的手繪二維碼app,以下它會分21*21或者更多的格子,告訴你哪一個該塗黑,相應的你就知道該填寫哪些數織數字。
可上面作法確實繁瑣了,數字本身寫,還得整理打印。
咋辦呢?
下面就是 Python 出場的時候了,用 Python 編寫一個輸入二維碼文字,一鍵生成數織圖片的程序而後****直接打印便可。
**完整代碼以下:
**
import numpy as np
import matplotlib.pyplot as pltfrom matplotlib.pyplot
import savefig
import qrcode
def qr_matrix(data): qr = qrcode.QRCode(version=1, box_size=1, border=1)
qr.add_data(data) return np.asarray(qr.get_matrix(), dtype = int)def _rle(matrix):
# find run start and ends d = np.diff(matrix)
row, start_pos = np.where(d > 0) _, end_pos = np.where(d < 0)
# find run lengths run_lengths = end_pos - start_pos
# split runs from different rows into separate arrays
split_on = np.cumsum(np.bincount(row - 1))[:-1]
return np.split(run_lengths, split_on)def run_length_encode(matrix):
rle_row = _rle(matrix) rle_col = _rle(matrix.T)
return rle_row, rle_coldef nonogram_qr(data): qr = qr_matrix(data)
row_rle, col_rle = run_length_encode(qr) shape = np.array(qr.shape) - 2
return shape, row_rle, col_rledef draw_nonogram(shape, row_rle, col_rle): r, c = shape
f = open('qr.griddler', "w") f.write('MK Version 3.0') f.write('\n') f.write('\n')
f.write(str(r)+' '+str(c)) f.write('\n') f.write('\n')
q=np.zeros((r,c),dtype=int) for qq in q: f.write(str(qq)[1:-1].replace("0", "?"))
f.write('\n') f.write('\n') for col in col_rle:
f.writelines(str(col[::-1])[1:-1]) f.write('\n') f.write('\n')
for row in row_rle: f.writelines(str(row[::-1])[1:-1]) f.write('\n')
fig, ax = plt.subplots(figsize=(10, 10)) plt.axis('off') plt.axis('equal')
# draw the grid for the nonogram: for i in range(r + 1):
ax.plot([0, c], [-i, -i], 'k-') for j in range(c + 1):
ax.plot([j, j], [0, -r], 'k-') # draw the numbers onto the grid
for i, row in enumerate(row_rle): for idx, val in enumerate(row[::-1]):
ax.annotate(xy=(-idx - 0.5, -i - 0.5), s=val, ha='center', va='center')
for j, col in enumerate(col_rle): for idx, val in enumerate(col[::-1]):
ax.annotate(xy=(j + 0.5, idx + 0.5), s=val, ha='center', va='center')
# adjust x and y limits lim_left = max([len(x) for x in row_rle + col_rle]) + 1
lim_right = max(r, c) + 1 ax.set_xlim(-lim_left, lim_right)
ax.set_ylim(-lim_right, lim_left)
return axname=input('請輸入二維碼內容(好比七夕快樂 愛你的XXX?):')
ax = draw_nonogram(*nonogram_qr(name))
print('製做完成,圖片名字叫作:打印吧.jpg')savefig("打印吧.jpg")# plt.show()
複製代碼
固然不想這麼麻煩的話,我這裏把程序也打包好了,各位直接運行exe 程序便可。
下面說說這個打包程序。
以下,下載解壓,運行(注意可能打開速度挺慢,耐心等待黑框出現),輸入二維碼文字。
其實吧,這個生成的21*21或者以上大小的數織難度仍是挺高的,不能讓女朋友作不出來啊,你得在身邊提示一下啊,那麼這款解密軟件派上用場!!
這個禮物認認真真整出來,估計得花個個把小時,七夕好時光,好好利用哈!!
哈哈哈哈,若是是須要完整的素材文件,項目代碼遇到簡單的問題也能夠找小編解答哦!!互相學習!
私信小編:06便可獲取免費資料!