zoukankan      html  css  js  c++  java
  • python实现图片转字符画

    python实现图片转字符画

    字符画,就是一系列字符的组合,组成的形状是一幅可识别的图画


    原理:
    每一张彩色的图片,之所以能够呈现出colorful或者dim的画面,是因为每一张图都由很多个像素点组成,而每一个像素点都有不同的颜色,而这个颜色就由三个值(rgb)对应三原色的百分比构成,所以每一个像素点都有三个值(rgb,范围0-255),我们可以将每一个像素点转换成一个字符来形成字符图画
    灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像
    rgb转换成灰度值公式:gray=int(r0.299+g0.587+b0.114)
    通过这个公式可以将256
    256*256的范围减少到0-255,同样,也没有256个单色字符去一一对应范围啊,这个时候可以灵活变通,将两到三个灰度值对应为一种字符
    再具体的原理就不再进行过多解释
    要实现图片转字符画功能,需要一个第三方图像处理库PIL(Python Image Library)

    实现字符画所需要的字符集(共70个)

    ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`'. ")
    
    from PIL import Image  #PIL是python的图像处理库
    ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`'.")
    WIDTH = 60
    HEIGHT = 45
    #设置字符画的宽高
    
    #将256个灰度映射到70个字符上,也就是RGB转字符
    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)] #不同灰度对应不同的字符
    
    if __name__ == '__main__':	
    	img = 'D:/python/cat.png'            #图片所在位置(反斜杠)
    	im = Image.open(img)
    	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 += '
    '
    	print(txt)   #打印出字符画
    	with open("C:/Users/Vincent/Desktop/3.txt",'w') as f:
    		f.write(txt)
    

  • 相关阅读:
    python之定时器Timer
    (转载)Python一篇学会多线程
    docker速记
    IP地址简单入门
    pycharm快捷键及一些常用设置(转载)
    python系列1_travel
    Fluter基础巩固之Dart语言详解<三>
    Fluter基础巩固之Dart语言详解<二>
    Fluter基础巩固之Dart语言详解<一>
    Java精通并发-Condition编程模式详解与分析
  • 原文地址:https://www.cnblogs.com/serendipity-my/p/12915569.html
Copyright © 2011-2022 走看看