1、實(shí)例目的
將一張圖片用字符集表示,轉(zhuǎn)化為文本文件宙搬。
轉(zhuǎn)化后的字符畫(huà):
2、實(shí)例代碼
該實(shí)例需要用到PIL庫(kù)拓哺,如果沒(méi)有的勇垛,可以在cmd中輸入:pip install PIL。
首先士鸥,準(zhǔn)備一個(gè)字符集闲孤,從該字符集中選擇字符來(lái)替代圖片中的像素。
#用這些字符來(lái)替代像素塊
char_set = '''$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. '''
然后讀取圖片
from PIL import Image
im=Image.open('qq.jpg') #讀取圖片
im=im.resize((80,60),Image.ANTIALIAS) #將圖片進(jìn)行縮放,ANTIALIAS是PIL中帶的濾鏡縮放結(jié)果
im=im.convert('L') #將圖片轉(zhuǎn)化為灰色圖片
im.save('pic.jpeg')
上面代碼用到的全是Image中的方法這一篇博客中都有介紹到烤礁,大家可以看一下讼积。
然后對(duì)于convert方法,用來(lái)設(shè)置轉(zhuǎn)化模式的脚仔,有三種比較常用的模式勤众。①RGB模,式RGB色彩模式是工業(yè)界的一種顏色標(biāo)準(zhǔn)鲤脏,是通過(guò)對(duì)紅(R)们颜、綠(G)吕朵、藍(lán)(B)三個(gè)顏色通道的變化以及它們相互之間的疊加來(lái)得到各式各樣的顏色的,每個(gè)通道的值在0~255之間窥突。②1模式努溃,轉(zhuǎn)化為二值圖片,非黑即白阻问,每個(gè)像素用8個(gè)bit表示梧税,0表示黑,255表示白称近。③L模式轉(zhuǎn)化為灰色圖像第队,每個(gè)像素用8個(gè)bit表示,0表示黑煌茬,255表示白斥铺,0~255代表不同的灰度彻桃。需要注意的是坛善,在PIL中,RGB是通過(guò)以下公式轉(zhuǎn)化為L(zhǎng)的:L = R * 299/1000 + G * 587/1000 + B * 114/1000邻眷。關(guān)于三種模式的效果眠屎,可以看一下這個(gè)博客
接下來(lái)就是將每個(gè)像素塊對(duì)應(yīng)的灰色值轉(zhuǎn)化為字符了。
#為用符號(hào)去代替像素塊
def get_char(gary):
if gary>240:
return ' '
else:
return char_set[int(gary/((256.0+1)/len(char_set)))]
最后利用一個(gè)循環(huán)將圖片的每一個(gè)像素塊的灰色值讀取后并用符號(hào)集替代返回寫(xiě)入到text字符串中肆饶。
#遍歷每一個(gè)像素塊得到其值改衩,并用相應(yīng)的符號(hào)替代寫(xiě)入text字符串中
for i in range(im.height):
for j in range(im.width):
gary=im.getpixel((j,i))
if isinstance(gary,tuple): #可能返回一個(gè)int值,也可能返回一個(gè)三元組
gary= int(0.2126*gary[0]+0.7152*gary[1]+0.0722*gary[2])
test+=get_char(gary)
test+='\n'
最終將test寫(xiě)入TXT文本即可驯镊,完整代碼如下:
from PIL import Image
#用這些字符來(lái)替代像素塊
char_set = '''$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. '''
im=Image.open('qq.jpg') #讀取圖片
im=im.resize((80,60),Image.ANTIALIAS) #將圖片進(jìn)行縮放
im=im.convert('L') #將圖片轉(zhuǎn)化為灰色圖片葫督,ANTIALIAS是PIL中帶的濾鏡縮放結(jié)果
im.save('pic.jpeg')
#為用符號(hào)去代替像素塊
def get_char(gary):
if gary>240:
return ' '
else:
return char_set[int(gary/((256.0+1)/len(char_set)))]
test=''
#遍歷每一個(gè)像素塊得到其值,并用相應(yīng)的符號(hào)替代寫(xiě)入text字符串中
for i in range(im.height):
for j in range(im.width):
gary=im.getpixel((j,i))
if isinstance(gary,tuple): #可能返回一個(gè)int值板惑,也可能返回一個(gè)三元組
gary= int(0.2126*gary[0]+0.7152*gary[1]+0.0722*gary[2])
test+=get_char(gary)
test+='\n'
with open('pic.txt','w')as f:
f.write(test)
【注:得到txt文件不要直接打開(kāi)橄镜,直接打開(kāi)看不出效果的,選擇打開(kāi)方式冯乘,用瀏覽器打開(kāi)即可】
參考:http://www.coolpython.net/python_senior/miny_pro/char_picture.html
https://www.cnblogs.com/liyichen/p/12580120.html