目录
一、思路
1.导入图片(最好背景图为白色,效果最好),通过pillow包进行导入,如果没有pillow包,在pycharm中可通过file-settings-project-python interpreter-'+'搜索安装。
2.设置图片大小,通过resize方法改变图片大小
3.把图片转化成灰度图,这里通过像素点完成,每张图片都是由像素点构成。
4.把每个像素点的值改成字符
5.保存字符画
二、代码实现
from PIL import Image char=list('QMWENBFQ#$OVC?7>!:-;. ') def get_char(r,g,b,alpha=256): #如果透明度为0,输出空。 if alpha==0: return ' ' #透明度不为0,转化成灰度值grey(越浅灰度值越小->0,越深灰度值越大->255) grey=(2126*r+7152*g+722*b)/10000 #(0,1)*长度19=(0,19) char_idx=int((grey / (alpha+1.0))*len(char)) return char[char_idx] def write_file(output_file,content): with open(output_file,'w') as f: f.write(content) def main(file_name="input.jpg",width=100,height=80,output_file='output.txt'): #初始化 text='' #导入图片 img=Image.open(file_name) #改变尺寸 img=img.resize((width,height),Image.NEAREST) #生成像素点,并且把每个像素点的rgb值取出(getpixel->(r,g,b)) for h in range(height): for w in range(width): text += get_char(*img.getpixel((w,h))) text+='\n' print(text) write_file(output_file,text) if __name__=='__main__': main('D:\\study\\pkq.jpg')
三、代码解读
1.导入pillow包,可简写为PIL。从PIL包中导入Image模块
2.设置之后把像素点改成字符时所用的字符,这里字符可以随便设
3.先看main()函数,程序的主体
第一步,使用img=Image.open(file_name)读取图片。
第二步,使用img=img.resize((width,height),Image.NEAREST)改变图片大小,在这里宽高设置为100和80,这里第二个参数Image.NEAREST是低质量缩放,默认也是这个,可以不用加
第三步,因为图片是一个数字二维矩阵,所以用两次循环取每个像素点的值。并且利用*img.getpixel((w,h))函数得到像素点的rgb值,通过自定义函数get_char得到的字符保存在text中,所以在此之前需要初始化text
第四步,打印字符text,并且用自定义函数write_file(output_file,text)保存
4.到这里看get_char自定义函数,已知在主函数中把每个像素点的rgb值作为参数传给get_char函数。进入函数,如果透明度为0时,说明这个像素点是白色背景,打印空格。如果不是则利用grey=(2126*r+7152*g+722*b)/10000,对像素点进行灰度转换,可以在网上查到。每一种颜色对应一个灰度值,通过char_idx=int((grey / (alpha+1.0))*len(char))得到每一种颜色对应的下标,再根据下标找到char中对应的字符,传给主函数
5.这里看write_file函数,该函数是把字符保存成txt文件。output_file是保存成txt的名字,对应主函数中的output.txt。with open(output_file,'w') as f是打开output.txt文件以写的方式,这个函数命名为f,f.write(content)写入传过来的text,这里的content
6.if __name__=='__main__':
main('D:\\study\\pkq.jpg')
这里我传入的是一张皮卡丘的图片。
四、效果展示
原图
字符画