python實現圖片轉字符畫
字符畫,就是一系列字符的組合,組成的形狀是一幅可識別的圖畫
原理:
每一張彩色的圖片,之所以能夠呈現出colorful或者dim的畫面,是因為每一張圖都由很多個像素點組成,而每一個像素點都有不同的顏色,而這個顏色就由三個值(rgb)對應三原色的百分比構成,所以每一個像素點都有三個值(rgb,范圍0-255),我們可以將每一個像素點轉換成一個字符來形成字符圖畫
灰度值:指黑白圖像中點的顏色深度,范圍一般從0到255,白色為255,黑色為0,故黑白圖片也稱灰度圖像
rgb轉換成灰度值公式:gray=int(r0.299+g0.587+b0.114)
通過這個公式可以將256256*256的范圍減少到0-255,同樣,也沒有256個單色字符去一一對應范圍啊,這個時候可以靈活變通,將兩到三個灰度值對應為一種字符
再具體的原理就不再進行過多解釋
要實現圖片轉字符畫功能,需要一個第三方圖像處理庫PIL(Python Image Library)
實現字符畫所需要的字符集(共70個)
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
from PIL import Image #PIL是python的圖像處理庫
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'.")
WIDTH = 60
HEIGHT = 45
#設置字符畫的寬高
#將256個灰度映射到70個字符上,也就是RGB轉字符
def get_char(r,g,b,alpha = 256):
if alpha == 0:
return ''
length = len(ascii_char)
gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) #計算灰度
unit = (256.0 + 1)/length
return ascii_char[int(gray/unit)] #不同灰度對應不同的字符
if __name__ == '__main__':
img = 'D:/python/cat.png' #圖片所在位置(反斜杠)
im = Image.open(img)
im = im.resize((WIDTH, HEIGHT), Image.NEAREST)
txt = ""
for i in range(HEIGHT):
for j in range(WIDTH):
txt += get_char(*im.getpixel((j,i))) #獲得相應的字符
txt += '\n'
print(txt) #打印出字符畫
with open("C:/Users/Vincent/Desktop/3.txt",'w') as f:
f.write(txt)