Python實現將圖片轉換為ASCII字符畫
前言
要將圖片轉換為字符圖其實很簡單,我們首先將圖片轉換為灰度圖像,這樣圖片的每個像素點的顏色值都是0到255,然後我們選用一些在文字矩形框內占用面積從大到小的ASCII碼字符,我經過一番觀察選擇瞭如下字符:
ascii_chars = "MNHQ$OC67+>!:-. "
很明顯M的筆畫比N多,縮小到足夠小之後就會體現出M的顏色比N更深,大傢若能夠找到更能夠體現這種特征的字符,也可以替換。
然後我們隻需要將圖片的目標像素點映射到這批字符上,代碼大概就是:
ascii_chars[color*(len(ascii_chars)-1)//255]
字符畫圖片生成
先準備好測試圖片:
from PIL import Image img = Image.open('test.jpg') img
然後我們將圖片轉換為灰度圖片並縮放到指定大小:
new_w = 100 w, h = img.size img = img.convert("L").resize((new_w, int(new_w*h//w))) w, h = img.size data = img.load() img
然後開始繪制字符圖片:
from PIL import ImageFont, ImageDraw f_size = 3 img_new = Image.new('L', (w * f_size, h * f_size), 255) f = ImageFont.truetype('arial.ttf', f_size) d = ImageDraw.Draw(img_new) n = len(ascii_chars)-1 for y in range(h): for x in range(w): char = ascii_chars[data[x, y]*n//255] d.text((x * f_size, y * f_size), char, fill=0, font=f) img_new
個人感覺效果還是不錯的,我們可以把上述邏輯封裝成一個方法:
from PIL import Image, ImageFont, ImageDraw def img2charImg(filename, new_wight, font_size): "小小明:https://blog.csdn.net/as604049322" ascii_chars = "MNHQ$OC67+>!:-. " img = Image.open(filename) w, h = img.size img = img.convert("L").resize((new_wight, int(new_wight*h//w))) w, h = img.size data = img.load() img_new = Image.new('L', (w * font_size, h * font_size), 255) f = ImageFont.truetype('arial.ttf', font_size) d = ImageDraw.Draw(img_new) n = len(ascii_chars)-1 for y in range(h): for x in range(w): char = ascii_chars[data[x, y]*n//255] d.text((x * font_size, y * font_size), char, fill=0, font=f) return img_new
測試一下:
img2charImg("love.jpg", 200, 2)
效果:
分別是原圖和執行結果:
我們可以通過第二個參數調大字符程度,最終圖片的寬度是兩個參數相乘。
字符畫文字的生成
搞定瞭字符圖片的生成之後,我們考慮直接生成字符文字,但是ASCII碼字符在顯示時,往往寬度是高度的一半,所以我們在生成字符畫文字時需要事先將圖片高度壓扁一半。
完整代碼如下:
from PIL import Image def img2charTxt(filename, new_wight, txtname): "小小明:https://blog.csdn.net/as604049322" ascii_chars = "MNHQ$OC67+>!:-. " img = Image.open(filename) img = img.convert("L") w, h = img.size img = img.resize((new_wight*2, int(new_wight*h//w))) w, h = img.size data = img.load() result = [] n = len(ascii_chars)-1 for y in range(h): line = "".join(ascii_chars[data[x, y]*n//255] for x in range(w)) line += "\n" result.append(line) with open(txtname, "w") as f: f.writelines(result)
測試一下:
img2charTxt("test.jpg", 100, "image.txt")
可以看到在文本編輯器中的顯示效果是相當不錯的。
到此這篇關於Python實現將圖片轉換為ASCII字符畫的文章就介紹到這瞭,更多相關Python圖片轉換ASCII字符畫內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!