如何利用python實現(xiàn)圖片轉(zhuǎn)化字符畫
前言:
字符畫:字符畫是一系列字符的組合,我們可以把字符看作是比較大塊的像素,一個字符能表現(xiàn)一種顏色,字符的種類越多,可以表現(xiàn)的顏色也越多,圖片也會更有層次感。
如果我們想要手工繪制出字符畫,首先要有扎實的美術(shù)基礎(chǔ),其次還要花費大量的時間和精力。但是我們可以使用Python,只需要幾行代碼,就能夠?qū)⒁粡垐D片輕而易舉地轉(zhuǎn)化為一個字符畫。
實例1
效果圖:
理論很簡單,就是對圖片操作,這里需要用到PIL的python包,里面有很好用的圖像處理功能。
先打開圖片,把圖像調(diào)整大?。?/strong>
img = Image.open(picPath) img = img.resize((picW, picH))
然后讀取灰度值,再把灰度值和字符對應(yīng)起來就行。
from PIL import Image lstChars = list("$@B%8&WM#*oahkbdpqwmZO0QLaCJUYXzczjhdhsdavunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'.") def oneChars(r, g, b, alpha = 256): global lstChars length = len(lstChars) gray = int(0.2126 * r + 0.7152 * g + 0.722 * b) index =length*gray return lstChars[index] picPath = "C:\Users\Administrator\Desktop\\aaaaa\\aa.png" picH = 40 picW = 80 img = Image.open(picPath) img = img.resize((picW, picH)) txt = "" for y in range(picH): for x in range(picW): txt += oneChars(img.getpixel((x, y))) txt += '\n' print txt
實例2
下面是源碼:
# -*- coding=utf-8 -*- from PIL import Image IMG = 'IMG.jpg' ?# 設(shè)置圖片文件 WIDTH = 150 ?# 設(shè)置字符畫的寬 HEIGHT = 80 ?# 設(shè)置字符畫的高 OUTPUT = 'T.txt' ?# 設(shè)置存放字符畫的文本文件 ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ") ?# 設(shè)置顯示的字符集 # 將256灰度映射到70個字符上 def get_char(r, g, b, alpha=256): ???# alpha為透明度 ???# 判斷 alpha 值,為0表示全透明 ???if alpha == 0: ???????return ' ' ???# 獲取字符集的長度,這里為 70 ???length = len(ascii_char) ???# 將 RGB 值轉(zhuǎn)為灰度值 gray,灰度值范圍為 0-255 ???gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) ???# 灰度值范圍為 0-255,而字符集只有 70 ???# 需要進(jìn)行如下處理才能將灰度值映射到指定的字符上 ???# 防止當(dāng)灰度值為255時,輸出的第70個字符超出列表索引,所以需要將(255+1) ???unit = (255.0 + 1) / length ???# 返回灰度值對應(yīng)的字符 ???return ascii_char[int(gray / unit)] if __name__ == '__main__': ???# 打開并調(diào)整圖片的寬和高 ???im = Image.open(IMG) ???im = im.resize((WIDTH, HEIGHT), Image.NEAREST) ???# 初始化輸出的字符串 ???txt = "" ???# 遍歷圖片中的每一行 ???for i in range(HEIGHT): ???????# 遍歷該行中的每一列 ???????for j in range(WIDTH): ???????????# 將 (j,i) 坐標(biāo)的 RGB 像素轉(zhuǎn)為字符后添加到 txt 字符串 ???????????txt += get_char(*im.getpixel((j, i))) ???????# 遍歷完一行后需要增加換行符 ???????txt += '\n' ???# 輸出到屏幕 ???print(txt) ???with open(OUTPUT, 'w') as f: ???????f.write(txt)
直接粘貼即可,只需要在文件夾中導(dǎo)入一張圖片重命名為IMG.jpg。運行結(jié)果會生成一個名為T.txt的文件。
原圖:
生成文件圖:
到此這篇關(guān)于如何利用python實現(xiàn)圖片轉(zhuǎn)化字符畫的文章就介紹到這了,更多相關(guān)python字符畫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用python實現(xiàn)數(shù)組、鏈表、隊列、棧的方法
數(shù)據(jù)結(jié)構(gòu)是指相互之間存在著一種或多種關(guān)系的數(shù)據(jù)元素的集合和該集合中數(shù)據(jù)元素之間的關(guān)系組成。這篇文章主要介紹了使用python實現(xiàn)數(shù)組、鏈表、隊列、棧的相關(guān)知識,需要的朋友可以參考下2019-12-12python markdown轉(zhuǎn)html自定義實現(xiàn)工具解析
Python-Markdown2 是一個 Python 庫,用于將 Markdown 文本轉(zhuǎn)換為 HTML,它是對標(biāo)準(zhǔn) Markdown 語法的擴展,提供了一些額外的功能和選項,同時還兼容標(biāo)準(zhǔn) Markdown,用它可以方便地生成漂亮的文檔、博客文章、項目文檔等2024-01-01如何用python?GUI(tkinter)寫一個鬧鈴小程序(思路詳解)
這篇文章主要介紹了用python?GUI(tkinter)寫一個鬧鈴小程序思路詳解,涉及到tkinter一些函數(shù)控件,數(shù)據(jù)的類的封裝,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12python操作小程序云數(shù)據(jù)庫實現(xiàn)簡單的增刪改查功能
這篇文章主要介紹了python操作小程序云數(shù)據(jù)庫實現(xiàn)簡單的增刪改查功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-06-06Pytorch中使用ImageFolder讀取數(shù)據(jù)集時忽略特定文件
這篇文章主要介紹了Pytorch中使用ImageFolder讀取數(shù)據(jù)集時忽略特定文件,具有一的參考價值需要的小伙伴可以參考一下,希望對你有所幫助2022-03-03