最近看到將圖片轉化爲字符圖的小實驗,我覺得很有趣,所以決定自己實現一下。
步驟和原理如下:
讀取圖片的灰度值矩陣(0-255之間),灰度值矩陣主要反映的是圖片的黑白程度,越黑越接近與0,越白越接近於255
確定用於作畫的字符
根據灰度值確定代替字符,灰度值越小,其代替字符應該筆畫越多(這樣才能看起來顏色更深)
把全部選好的代替字符寫入文本
選擇字符的做法:用256(0-255又256個數)除以可以用於作畫的字符的總長度,然後得到一個字符的灰度值區間。然後灰度值在某個區間是就轉化爲指定的字符。
我從google圖片下載了一張小豬佩奇的圖片,侵刪,然後用它來畫字符畫,結果如下:
還是蠻像的!
代碼如下:
# coding: utf-8
import numpy as np
from PIL import Image
def img_to_char(image_path,height):
'''
將圖片轉化爲字符
image_path是圖片的路徑
height是字符串圖片的高度
'''
#讀取圖片
img = Image.open(image_file)
img_width, img_height = img.size
# 假設字符的寬度是高度的3倍
width = 3* height * img_width // img_height
img = img.resize((width, height), Image.ANTIALIAS)
#讀取圖片的灰度值矩陣
data = np.array(img.convert('L'))
#設定字符,字符數要是256的因子,這裏取32
chars = "#RMNHQODBWGPZ*@$C&98?32I1>!:-;. "
N = len(chars)
#計算每個字符的區間,//取整
n = 256 // N
#result是字符結果
result = ''
for i in range(height):
for j in range(width):
result += chars[data[i][j] // n]
result += '\n'
with open('img.txt', mode='w') as f:
f.write(result)
if __name__ == '__main__':
image_file = '10.jpg'
height = 100
img_to_char(image_file,height)