1、灰度图与字符画
黑白照片大家都不陌生,但黑白照片并不是只有黑白两种颜色,还有介于黑和白之间的颜色,这些颜色色深度从0到255,0是黑色,255是白色,也叫灰度值
制作一张字符画的原理就是先将一张图片转为灰度图,也就是黑白照片的样子,然后呢,根据灰度值的不同,用不同的字符来替换
2、PIL
PIL库可以用来处理图片,接下来需要定义一组字符
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
前面的字符看起来都比较重,后面的都比较弱小,因此重的字符去替换图片中颜色深的地方,后面的字符去替换颜色浅的地方
3、示例代码
# coding=utf-8
from PIL import Image
import click
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
# 将256灰度映射到70个字符上
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)]
@click.command()
@click.option('--file')
@click.option('--height', default=60)
@click.option('--width', default=120)
@click.option('--output')
def change(file, height, width, output):
im = Image.open(file)
print height, width
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'
txt = txt.replace('.', ' ')
with open(output, 'w') as f:
f.write(txt)
if __name__ == '__main__':
change()
需要注意 txt = txt.replace('.', ' ') 这句话,你可以不在自己的程序加,我加上是为了让字符画更简洁
找一张实验图片
执行命令
python my_pic_to_txt.py --file=1.jpg --output=1.txt --width=120 --height=40
最终得到的结果如下
`'' ^ ' '' '' ''' ' ' ` ' ' ' ' ` ' '
' &W&WW&&8M '?uULQCn)` tWB8' LB8&&BqI^ ''(?}b&%88|
'nW8WW&&&W&WMm wt '"' ' '(m_/88&W&W&W&&8p ` `kMW&W&&@W_' +wc> ` ` ' ?zm' "}]}?-MWWM%Wd'
'zM&8&&&&&a&%i '' ' l8MW&&&WWWWWb B&WWWWWWWM8&r '` ~}[][]}}c&WW&&&a'
'8&&WWWWWW8 `' ##WWWWW&&8 :M%WMWWWWWB' '`}]]-}}[]?lWW&&&W&`
B&WW&&M#{ "%WWWWWW& u&WWWWWWB~' ~{}[]!_}l<_xh>
#8MMW8W *MM8W&$ '-&8&M#&0 ':[][[}{Z?
8M&&B"` U&MM%' BWW&8Z' `)}][[][}[:
"t#8 "@WU #&&0'` }{}[[]}}]:
`'"i' ' /Bb" uo{ ^: `a ' '' ``' '` +?]}[{?_
q ^x8&$&Wl ' `M888Mc d ^ p#W##x `'f#&8$; >?]?Y
' n WB * ' p;^ 8a"' ') :' 08k'']$ :8" ^%Wf ' 'l
} w& @b`% ' ' b c8 Bo ! f` :&r, " +^ "[+' `B&' >
u k% >' "`8&I W8 ] /' t8 @#!? '!a8% m&' l
q ^ #$" _/ 8&/" '1> ##I' k' 'Ba '] ` 8% )'
f ` m' ' $ ' C' 'x ' " 'xi ' ` `` > ' ^ '
'Q $'' '` l< `X ' q @' ' 'k `0
k ' #b>`u$l' `h` ' b @^ ` ;$ `x '
'~
'c[ ' !Z" L ` lO;
>]{+Y cu}}?` ?zuO" ' '^Ourz
,W#}){{}aI' ^`' '^ lqX[{?)n8&` '' @Wxvnz0< ` ' '' `!qxnunool'
BW]{-&]{[{]+\UkbpppaO/?-}[[[]-M&MM# ' *&W8UunvxxvOC[l^ :;}m0zxnuuUrnYa%
?WU])WM&J}]][}?]}}[]{}}]}}[[[(@&&MW8 ' M&&&&&nnxuuvxxxxuvnxurunnnuu##bnnY&x
YM8b8WWWWb
/&&WWWW&WW)!{]{[[}}[}}}}[}~+WWWWWW&WI `MWWWWW&WWJcxnnnnnnnnnnvxc:1M&M&&WWWW
+&&WWWW&W&$':+1}[}}[}}}}?:I"8WWWWWMW< WWWWWWW&;/vnnnnnnuuxv-i>!c8MW&WWW&
xJ&W&WWWWWW#:I"i]{}]}}>,;:`#MWWWWW&&v '`aW&WWWWWWWZ!>}cvxnxcx+
q,oMM&&WWWW&:;:;;I;:I;:I,`&WWWW&W&M#d ^'8M&&WWW&W#x>!!!!i!i!!l>
a'I$8WWWW&WWU;I;;;;;:;II;h%&&W&Mo&$ o il;8&M#WW#&W8I!ii!>i!!i!!:8WW&WW&MMM]'
''BW^: *#&$:::;;;;;;;I;:CMWW#&W&/: $ }xl>0##&WWWWM>ii!!!!!!ii!lWWWW&&WaC:}+
,l:~p8W&&l":`l[I^;;II;;;;;;;;;;;!88Bh";: B&b ' ' \%W|>l:|88BpIl!ii!!!!!ii>!lXM&W8Wuil;B@ `
W&8#&&WW#cl;II;l:l;;;;;;;;;;;;;;:II;l::"@&&*&BWM$x ' $%8W&WMWWfil>!!>>!!!!!!!!!>;;;">!~lMW&8w! l
BW&WWWWWWMw:!;I;;;;;;;;;;;;;;;I;:;I:I: BWW&&&&&&&Q @&WWWWWW8&>iIii>i!!!!!!!!!!!!!!!!ii!!i>"&W&WWWWWW8l
'-&W&WWWWWW&@":II;;;;;;;;;;;;;;;I;I;I:{&MM&&&&&&%% ` (8WWWWWWWM#{>>>!!!!!!!!!!!!!!!!!!!!>>l>##&WWWWW&&&`
j#WWWWWWWW#@ l":I;;;;;;;;;;;;;;;;;`pWWWWW&&&&+ @8W&WWWWWM*a>!!!!!!!!!!!!!!!!!!!!>iix*WWWWWWWW&&O
'`#W%WWMWW&&WB`l;::IlIllIII;I;;;'&M&W&&&&&W&M$; W8&WWWWWMW&8|>ii!>ii!!!!!!!i!!l>~C&WWWWWW&WWM#\''
'' ]##*obOY\>^ ^+tYCmbaahhhhbbqZx)Co88MWW&&8'' ' ^,|WWWWWWW&WW&801->i!III;;:;IIIl|&WW&&&&WW&&&% ''
' ` `' ' ' ''` '' ' ' ` :\QQn^ ''