点击上方 "程序员小乐"关注公众号, 星标或置顶一起成长
每天早上8点20分, 第一时间与你相约
每日英文
Whatever you are facing today, remember to give yourself some credit for making it this far. You are stronger than you know.
无论你今天要面对什么,既然走到了这一步,就奋 斗下去,给自己一些肯定,你比自己想象中要坚强。
每日掏心话
生活中没有什么可怕的东西,人活一世,感性的同时,总是少不了理性的克制。
来自:小象 | 责编:乐乐
程序员小乐(ID:study_tech)第 629 次推文 图片来自网络
正文
1.设计思路
如何把以.png的图片以不同字符把它形象的画出来呢?
我们知道其实一张图片是由很多不同像素点所组成的,每种像素点可以表示一种颜色。
那么如果我们用不同的字符来代替各种像素点,是不是就可以将图片转化为字符画了?
没错就是要用这个原理。
2.准备工作
为了实现我们本篇博文所述的功能,不需得有一个叫做Pillow(PIL)的图像处理库
该库的安装方式如下
pip install pillow
3.代码实现
#! /usr/bin/python
#coding:utf8
import argparse
from PIL import Image
def handle_command():
'命令行参数处理'
parser = argparse.ArgumentParser()
parser.add_argument('filename',help = '图片的路径')
parser.add_argument('-o','--output',help = '是否输出文件')
parser.add_argument('--width',type = int,default = 80)
parser.add_argument('--heigth',type = int,default = 80)
#获取命令行参数
return parser.parse_args()
args = handle_command()
class Ptrancefrom(object):
'实现将图片转化为字符'
def __init__(self,img,width,heigth):
self.img = img
self.width = width
self.heigth = heigth
self.ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
def get_char(self,r,b,g,alpha = 256):
'将256范围的灰度值映射到70个字符上'
#灰度值为0时对应字符为空格
if alpha == 0:
return ' '
length = len(self.ascii_char)
#灰度值的计算公式
gray = int(0.2126 *r + 0.7152*g + 0.0722*b)
unit = (256.0 + 1)/length
return self.ascii_char[int(gray/unit)]
def print_picture(self):
'打印图形'
#打开图片
im = Image.open(self.img)
#设置图片像素的大小
im = im.resize((self.width,self.heigth),Image.NEAREST)
txt = ""
for i in range(self.heigth):
for j in range(self.width):
txt += self.get_char(*im.getpixel((j,i)))
txt += '\n'
print txt
def write_to_file(self):
'将生成的字符图片写入到文件'
if args.output:
with open(args.output,'w') as f:
f.write(txt)
else:
with open('output.txt','w') as f:
f.write(txt)
pic = Ptrancefrom(args.filename,args.width,args.heigth)
pic.print_picture()
运行上述脚本
选材的图片原图如下
效果图如下
嘿,你在看吗?