五分钟30⾏代码使⽤Python制作熊猫表情包(图⽚字符化)(附有源码逐⾏分
析)
@
⽬录
⼀.Demo
相信许多的⼩伙伴在平时玩QQ的时候都有发过这样⼀张表情包,如下:
它其实是由下⾯的⼀张表情包演化⽽来。
今天我们就来教⼤家如何制作它。
⼆.程序演⽰加讲解
# coding=utf-8
from PIL import Image
import argparse
#----------------------------------------------#
#命令⾏输⼊参数处理
#----------------------------------------------#
#构建命令⾏输⼊参数处理ArgumentParser实例
parser = argparse.ArgumentParser()
#输⼊⽂件
parser.add_argument('file', default='D:/课程/python/image/myimage1.jpg')
#输出⽂件
parser.add_argument('--output', default=0)
#输出⽂件的宽
parser.add_argument('--width', type=int, default=80)
#输出⽂件的⾼
parser.add_argument('--height', type=int, default=80)
#-----------------------------------------------#
# 获取参数
#-----------------------------------------------#python新手代码画图
#解析并获取参数
args = parser.parse_args()
#输⼊的图⽚路径
IMG = args.file
#输⼊的图⽚宽度
WIDTH = args.width
#输⼊的图⽚⾼度
HEIGHT = args.height
#输出字符画的路径
OUTPUT = args.output
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)
#RGB转灰度值
gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
unit = (256.0 + 1) / length
return ascii_char[int(gray / unit)]
if __name__ == '__main__':
rgb_im = Image.open(IMG)
im = vert('RGB')
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'
print(txt)
我们在Pycharm中的Terminal,先进⼊我们项⽬所在地,然后输⼊如下命令进⾏传参运⾏。
python 01.py D:/课程/python/image/myimage1.jpg --output=0 --width=45 --height=20
我们就能将我们的图⽚数字化。
下⾯是博主亲⾃实验得出的图⽚:
三.分析程序
补充的知识:
灰度值:指⿊⽩图像中点的颜⾊深度,范围从0到255,⽩⾊为255,⿊⾊为0,所以⿊⽩图⽚也称灰度图像。
RGB:red,green,blue,三原⾊,⼈们⽇常所能看到的颜⾊都是由三原⾊组成
我们的实验原理就是将RGB值映射到灰度值上
我们建⽴⼀张列表,灰度值⼩的在列表的开头,灰度值⼤的作为列表的结尾。这样就能建⽴起原图与数字化图⽚之间的联系。
(1)主函数:
Image.open(file)
返回⼀张图⽚,file为⽂件存储路径
vert(mode)
返回⼀张图⽚,图⽚经过格式转换,mode为⼀种颜⾊转换模板。
(其他参数,dither:控制颜⾊抖动,palette:调动调⾊板,Color:控制调⾊板的颜⾊数⽬,最⼤有256种)
返回⼀张图⽚,变量size是所要求的尺⼨,是⼀个⼆元组:(width, height)。变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之⼀。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST。
(2)RGB转灰度值
alpha=0 表⽰空⽩
最⼤为alpha = 255
(3)灰度值转换成字符
果是⼀个元组.* 可以将元组作为参数传递给 get_char,同时元组中的每个元素都对应到 get_char 函数的每个参数。
(4)当然,如果我们想要以⽂件的形式输出,可以加⼊使⽤下⾯的程序
if OUTPUT:
with open(OUTPUT, 'w') as f:
f.write(txt)
else:
with open("", 'w') as f:
f.write(txt)
四.注意事项
我们在⽤命令⾏运⾏程序的时候,不能写⼊file=,当然,也不能写成⽂件路径带有双引号或者单引号,参数之间⽤空格键隔开。
五.程序的改进
我们可以通过改变ascii_char的值,来改变我们的程序,使得效果最佳。
⼩技巧:我们可以使得相同或相近的颜⾊区域字符相同,这样能得到好的效果。如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论