拷贝代码和图片在同一级目录下运行:
from PIL import Image
import argparse
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
# 首先,构建命令行输入参数处理 ArgumentParser 实例
parser = argparse.ArgumentParser()
# 定义输入文件、输出文件、输出字符画的宽和高
parser.add_argument('file') #输入文件
parser.add_argument('-o', '--output') #输出文件
parser.add_argument('--width', type = int, default = 80) #输出字符画宽
parser.add_argument('--height', type = int, default = 80) #输出字符画高
# 解析并获取参数
args = parser.parse_args()
# 输入的图片文件路径
IMG = args.file
# 输出字符画的宽度
WIDTH = args.width
# 输出字符画的高度
HEIGHT = args.height
# 输出字符画的路径
OUTPUT = args.output
def get_char(r,g,b,alpha = 256):
# 判断 alpha 值
if alpha == 0:
return ' '
# 获取字符集的长度,这里为 70
length = len(ascii_char)
# 将 RGB 值转为灰度值 gray,灰度值范围为 0-255
gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
# 灰度值范围为 0-255,而字符集只有 70
# 需要进行如下处理才能将灰度值映射到指定的字符上
unit = (256.0 + 1)/length
# 返回灰度值对应的字符
return ascii_char[int(gray/unit)]
if __name__ == '__main__':
# 打开并调整图片的宽和高
im = Image.open(IMG)
im = im.resize((WIDTH,HEIGHT), Image.NEAREST)
# 初始化输出的字符串
txt = ""
# 遍历图片中的每一行
for i in range(HEIGHT):
# 遍历该行中的每一列
for j in range(WIDTH):
# 将 (j,i) 坐标的 RGB 像素转为字符后添加到 txt 字符串
txt += get_char(*im.getpixel((j,i)))
# 遍历完一行后需要增加换行符
txt += '\n'
# 输出到屏幕
print(txt)
# 字符画输出到文件
if OUTPUT:
with open(OUTPUT,'w') as f:
f.write(txt)
else:
with open("output.txt",'w') as f:
f.write(txt)
$$$$
$$d0x0o#uxx0z#$$
$WcxxxxW "kx} "hd$
$qxxxxxxJ "c Wxd$
$#xxxxxxxch # cxu$
$uxxxxxxxxk> p"- h} #xxxB
$0xxxxxxxxxx# # n "h I# nxxxx$
$Yxxxxxxxxxxx# I }C -qcxxx$
$Yxxxxxxxxxxxq#( "- z -occ$
$xxxxxxxxxxc#(Ip ( COC( h pu$
$xxxxxxxxxuh "> n}p zk8" "8$$$
mxxxxxxxxk" >C ff &\ kk }#># $
$xxxxxxxx# -Cp} ok\kkk> C( "$
cxxxxxxxW }zh( @kkkko > $
$xxxxxxxq }h 8kko( p
mxxxxxxx> - #pnf----I p
$xxxxxxuW >nn---I O $
$xxxxxx#" -> p I
Wxxxxxx> n- OhnI $
qxxxxx0 }&%%%pOn}I (( -n }Oh$
Jxxxxx# "kkkkkkka8%*aW%pn- -n }CI$
Jxxxxxp -kkkkkWB8akkkkkkoWBhp}I >z# $
cxxxxx} nk*%okkkkkkkkkkkkkkkkkkkkkkkk" $
Jxxxxx nkkkkkkkkkkkkkkkkkkkkkkkkkkk% $
Jxxxxx Ikkkkkkkkkkkkkkkkkkkkkkkkkkk-
qxxxxx akkkkkkkkkkkkkkkkkkkkkkkkkB f
Wxxxxx 8kkkaW%8#kkkkkkkkkkkkkkkkh" 8
$xxxxx Ik&YffffffQBhkkkkkkkkkkkkO z$
$xxxxx( $ffffffffffx@kkkkkkkkkkB $
mxxxx# "ufffffffffffbkkkkkkkk# I
$xxxxY nffffffffffffMkkkkkka" 8
uxxxxf hffffffffffffWkkkka> I
qxxxx# "Qfffffffffff%kkkkW O
$xxxxcp "bffffffffffckkk8 "$
dxxxxc omfffffffffa8C $
$xxxxxW CQffffffQz 8
$xxxxx} >hbpo( 8
#xxxxY" -(O%$} IBkkkkkkkoB
0xxxx0 >O%*kkkkB k#j>Ij#kk$
$Jxxm8akkkkoWW&" Jwj1j0C($
$$okkk*&Lxxxxd h_IIIIM $
$Wkh8qxxxxxxx# OIIXbIX *
$mxxxxxxxxxxq aII[wI# z
cxxxxxxxxxxxI uIII\j -
Jxxxxxxxxxxxp fhIII_h >
kxxxxxxxxxxx0p n" -(
$xxxxxxxxxJh >p8#phpCnnnCppI$ $$$
$xxxxxxuWcx pf p$ $} n$
$xxxJ#dxxx0 n n$8 f
xxxxxxxxx# p z$ $
Jxxxxxxxx# O h" h
kxxxxxxxx# " "8 O
Bxxxxxxxxm p pI p
$$$ $xxxxxxxxxI h "O} 8
#kkk$$xxxxxxxxx8 "hn- --zO $ $
$kkkk%$xxxxxxxxxJ -npnn- fh $
$kkkkM$xxxxxxxxxxk CxC }
akkk$$xxxxxxxxxxxq> Wxxz $
$$$$ Bxxxxxxxxxxxxx8} fhcxxxh I
qxxxxxxxxxxxxxxxxJYxxxxxxxm $
JxxxxxxxxxxxxxxxxxxxxxxxJd#( h
$$xxxxxxxxxxxxxxxxxxxJW$$ $- 8
h" xxxxxxxxxxxxxxxxc@$ $pp$$
$ uxxxxxxxxxxxxx0$
O #xxxxxxxxxxxJ$
> >xxxxxxxxxu$
Cxxxxxxuk$
#xxxxx8$
(ocJ$
- 8
O
$ $
O $
$" n
$*I p$
$$$
if __name__ == '__main__':
含义:作为启动文件 python_.py ,该文件的内置属性 __name__ 等于 “__main__”,而.py 作为导入模块,该模块的 __name__ 等于文件名(也称模块名字)