利用字符串生成工具可以方便的打印出自己想要字符图案,以及如何将图片转换为ASCII ART输出。

最终可以用命令行输出各种彩色图像---->>

一般字符图案

我们在使用一些开源软件的时候,启动打开的字符图形很好看。于是搜索到了一些工具来实现:

"""

_ _ _

| | | | ( )

| | ___ | |_|/ ___ __ _ ___

| | / _ \ | __| / __| / _` | / _ \

| |____ | __/ | |_ \__ \ | (_| | | (_) |

\_____/ \___| \__| |___/ \__, | \___/

__/ |

|___/

"""

1.网站taag

可以随意输入内容,调节字体、宽、高。

#一条小鳄鱼

# __ __

# _ _ /_@)_@) \ /^^\ /^\ /^^\_

# _/oo \____/~''. . . '~\ /'\'' ~ ''~~' -'\_

# / '.'. ~.~.~. .' ~ | /'\~~..''''.'' '' ~\_

# ('_'_'_'_'_'_'_'_ ' : ' \_/' '.'' . '. .'' '. ~\_

# ~V~V~V~V \ ~\ '' '~ ' '' ~ ` ~ '' ~\_

# /\~/\~/\~/\~/|/ ' '' _ ' ~ '' ' ~ '' __ ' .. \_

#

# \~ '. . : .:: ~. :. /_'''_'' \_' :'''_ : _ ''/''_' '_ \:_ '''' #''..\/\/\/~/\~ ''~~~~~O

# ~~ \-~ `---~~~---- \(_)(_)(_)/ ~ ~~' ~\(_)(_)(_)\_~_~_~_~_~/˜¤¹

如果想要在python中输出,只需要把上面的字符串赋值然后使用print函数打印即可,需要用多行注释来包含这些字符:

2.命令行工具figlet

figlet [ -cklnoprstvxDELNRSWX ] [ -d fontdirectory ]

[ -f fontfile ] [ -m layoutmode ]

[ -w outputwidth ] [ -C controlfile ]

[ -I infocode ] [ message ]

安转后直接在命令行中使用即可。更多高级用法参考doc

图片字符串图案

3.在python中显示字符串图片

这种方法的主要原理是利用一组视觉密度不同的字符,按照灰度去替换每一个像素:

可以将图像的灰度定义为不同的级别来显示:

gscale1 = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~i!lI;:,\"^.

gscale2 = "@%#*+=-:. " 这种灰度级别少一些

然后读入图像,将图像映射为长宽等比的矩阵;

然后将颜色灰度值映射到定义的灰度级别上来。

import sys

import cv2

grays = "@%#*+=-:. " #由于控制台是白色背景,所以先密后疏/黑色背景要转置一下

gs = 10 #10级灰度

#grays2 = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~i!lI;:,\"^.` "

#gs2 = 67

img = cv2.imread('where/your/img.jpg',0) #读入灰度图

#宽(列)和高(行数)

w = img.shape[1]

h = img.shape[0]

ratio = float(w)/h #调整长宽比 (**注:此比例为win cmd,ratio需要根据不同终端的字符长宽调整)

scale = w // 50 #缩放尺度,向下取整,每50个像素取一个 值越小图越小(scale 越大)

for y in range(0, h, int(scale*ratio)): #根据缩放长度 遍历高度 y对于h,x对应w

for x in range(0, w, scale): #根据缩放长度 遍历宽度

idx=img[y][x] * gs // 255 #获取每个点的灰度 根据不同的灰度填写相应的 替换字符

if idx==gs:

idx=gs-1

sys.stdout.write(grays[idx]) #写入控制台

sys.stdout.write('\n')

sys.stdout.flush()

4.输出彩色图像

首先我们将上面的灰度图转字符的代码封装成一个函数img_ascii:

def img_ascii(img,r=3):

#img: input img

#r: raito params #由于不同控制台的字符长宽比不同,所以比例需要适当调整。

#window cmd:r=3/linux console r=

grays = "@%#*+=-:. " #由于控制台是白色背景,所以先密后疏/黑色背景要转置一下

gs = 10 #10级灰度

#grays2 = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~i!lI;:,\"^.` "

#gs2 = 67 #67级灰度

#宽(列)和高(行数)

w = img.shape[1]

h = img.shape[0]

ratio = r*float(w)/h #调整长宽比-根据终端改变r

scale = w // 100 #缩放尺度/取值步长,向下取整,每100/50个像素取一个 值越小图越小(scale 越大)

for y in range(0, h, int(scale*ratio)): #根据缩放长度 遍历高度 y对于h,x对应w

strline=''

for x in range(0, w, scale): #根据缩放长度 遍历宽度

idx=img[y][x] * gs // 255 #获取每个点的灰度 根据不同的灰度填写相应的 替换字符

if idx==gs:

idx=gs-1

strline+=grays[idx] #写入控制台

print(strline)

#sys.stdout.flush()

然后利用控制台输出彩色的功能

#控制带自带的256色输出功能,demo如下

#from:#https://askubuntu.com/questions/821157/print-a-256-color-test-pattern-in-the-terminal

print("Color indexes should be drawn in bold text of the same color.")

colored = [0] + [0x5f + 40 * n for n in range(0, 5)] #array combined [0, 95, 135, 175, 215, 255]

colored_palette = [

"%02x/%02x/%02x" % (r, g, b) #转为16进制

for r in colored

for g in colored

for b in colored

]

grayscale = [0x08 + 10 * n for n in range(0, 24)]

grayscale_palette = [

"%02x/%02x/%02x" % (a, a, a)

for a in grayscale

]

normal = "\033[38;5;%sm"

bold = "\033[1;38;5;%sm"

reset = "\033[0m"

for (i, color) in enumerate(colored_palette + grayscale_palette, 16):

index = (bold + "%4s" + reset) % (i, str(i) + ':')

hex = (normal + "%s" + reset) % (i, color)

newline = '\n' if i % 6 == 3 else ''

print(index, hex, newline,)

##ref

#https://en.wikipedia.org/wiki/ANSI_escape_code

#https://github.com/grawity/code/blob/master/term/xterm-color-chooser

#https://unix.stackexchange.com/questions/404414/print-true-color-24-bit-test-pattern/404415#404415

可见核心是利用格式化输出ASCII转义码(ANSI escape code)来实现的:

print("\033[38;5;%sm #\n"%'1') #其中%s对应的就是256位颜色的一种

我们需要根据rgb值和对应的颜色构建查表或转换函数来将图形中的颜色(r,g,b)转为n[0,255]:

based = range(0,16)

based_palette = [

"%02x" %l #转为16进制

for l in based

]

colored = [0] + [0x5f + 40 * n for n in range(0, 5)] #array combined [0, 95, 135, 175, 215, 255]

colored_palette = [

"%02x/%02x/%02x" % (r, g, b) #转为16进制

for r in colored

for g in colored

for b in colored

]

grayscale = [0x08 + 10 * n for n in range(0, 24)]

grayscale_palette = [

"%02x/%02x/%02x" % (a, a, a)

for a in grayscale

]

color_256 = based_palette + colored_palette + grayscale_palette

#生成一个字典

color_dict={color:i for (i,color) in enumerate(color_256)}

#通过rgb值近似到00/5f/87/af/d7/ff来得到彩色值

#输出显示各种颜色

index =''

for (i,color) in enumerate(color_256):

index += "\033[38;5;%sm#"%i #其中#为各个颜色的输出显示

print(index)

或者可以选择公式来直接转换216种彩色:

16-231: 6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)(待验证)

A.首先我们需要定义一本RGB**到真彩的颜色字典,利用前面生成的color_256来定义:

#先定义颜色和对应的16进制值

based = range(0,16)

based_palette = [

"%02x" %l #转为16进制

for l in based

]

colored = [0] + [0x5f + 40 * n for n in range(0, 5)] #array combined [0, 95, 135, 175, 215, 255]

colored_palette = [

"%02x%02x%02x" % (r, g, b) #转为16进制

for r in colored

for g in colored

for b in colored

]

grayscale = [0x08 + 10 * n for n in range(0, 24)]

grayscale_palette = [

"%02x%02x%02x" % (a, a, a)

for a in grayscale

]

color_256 = based_palette + colored_palette + grayscale_palette

#生成一个字典

color_dict={color:i for (i,color) in enumerate(color_256)}

#color_dict={}

#for index,name in enumerate(color_256):

# color_dict[name]=index

B.随后我们需要定义函数将图像的RGB转换为对应的真彩像素:

#首先定义函数,利用颜色字典将RGB颜色转换为真彩对应数值

def cvtrgb(rgb,color_dict):

xx=''

#根据上面生成的颜色字典来,对于不同取值区间赋予不同的值

for i in range(3):

if rgb[i]<95:

xx+= '00'

elif rgb[i]<135:

xx+= '5f'

elif rgb[i]<175:

xx+= '87'

elif rgb[i]<215:

xx+= 'af'

elif rgb[i]<225:

xx+= 'd7'

else:

xx+= 'ff'

name = ''.join(xx)

value = color_dict[name]

return value

#随后对输入图进行遍历,将所有的RGB值转换为相应的真彩值

def cvtimg(img,color_dict):

ascii_img = np.array(img[:,:,0],dtype=np.string_)

for h in range(img.shape[0]):

for w in range(img.shape[1]):

ascii_img[h,w] = cvtrgb(img[h,w,:],color_dict) #调用换色函数

return ascii_img #返回值中每一个像素已经是真彩值

C.最后重新定义一个真彩ASCII彩色绘图函数来绘制,将原来的绘图函数略微修改即可:

def img_color_ascii(img,r=3):

#img: input img

#r: raito params #由于不同控制台的字符长宽比不同,所以比例需要适当调整。

#window cmd:r=3/linux console r=

grays = "@%#*+=-:. " #由于控制台是白色背景,所以先密后疏/黑色背景要转置一下

gs = 10 #10级灰度

#grays2 = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~i!lI;:,\"^.` "

#gs2 = 67 #67级灰度

#宽(列)和高(行数)

w = img.shape[1]

h = img.shape[0]

ratio = r*float(w)/h #调整长宽比-根据终端改变r

scale = w // 100 #缩放尺度/取值步长,向下取整,每100/50个像素取一个 值越小图越小(scale 越大)

for y in range(0, h, int(scale*ratio)): #根据缩放长度 遍历高度 y对于h,x对应w

strline=''

for x in range(0, w, scale): #根据缩放长度 遍历宽度

idx=img[y][x] * gs // 255 #获取每个点的灰度 根据不同的灰度填写相应的 替换字符

if idx==gs:

idx=gs-1 #防止溢出

######改变这里,将真彩值利用命令行格式化输出赋予

color_id = "\033[38;5;%sm%s"%(img[y][x],grays[2]) #输出!

strline+= color_id #按行写入控制台

print(strline)

D.下面就可以使用了:

#导入图片

import cv2

import matplotlib.pyplot as plt

import numpy as np

img0 = cv2.imread('img2.png')

img =cv2.cvtColor(img0,cv2.COLOR_BGR2RGB)

plt.imshow(img)

plt.axis('off')

plt.show()

随后利用前面定义的颜色转换函数得到ascii编码的颜色值:

#使用前面定义的颜色字典,颜色转换函数cvtrgb和图像映射哈数cvtimg

ass = cvtimg(img,color_dict)

ass = np.array(ass,dtype=np.int) #将array转化为int类型

img_color_ascii(ass,2.5) #彩色绘图函数,r=2.5调整比例,由于命令行行距存在需要微调r因子

下面就是一些转换的图像,一起来感受一下自己的ASCII ART。(由于截图,尺度可能有些许扭曲)

5. 彩蛋

在做完了上面所有的代码之后,发现了控制台的输出还可以直接使用RGB来表示:

"\033[38;2;r;g;bm "

所以无需进行颜色空间转换,直接利用RGB即可!

将上面的绘图函数稍加改变:

def img_RGBcolor_ascii(img,r=3):

#img: input img img here is 3channel!

#r: raito params #由于不同控制台的字符长宽比不同,所以比例需要适当调整。

#window cmd:r=3/linux console r=

grays = "@%#*+=-:. " #由于控制台是白色背景,所以先密后疏/黑色背景要转置一下

gs = 10 #10级灰度

#grays2 = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~i!lI;:,\"^.` "

#gs2 = 67 #67级灰度

#宽(列)和高(行数)

w = img.shape[1]

h = img.shape[0]

ratio = r*float(w)/h #调整长宽比-根据终端改变r

scale = w // 100 #缩放尺度/取值步长,向下取整,每100/50个像素取一个 值越小图越小(scale 越大)

for y in range(0, h, int(scale*ratio)): #根据缩放长度 遍历高度 y对于h,x对应w

strline=''

for x in range(0, w, scale): #根据缩放长度 遍历宽度

idx=int(img[100][100].mean()) * gs // 255 #获取每个点的灰度 根据不同的灰度填写相应的 替换字符

if idx==gs:

idx=gs-1 #防止溢出

######改变这里,将RGB值,利用2控制参数直接输入

color_id = "\033[38;2;%d;%d;%dm%s"%(img[y][x][0],img[y][x][1],img[y][x][2],grays[2]) #输出!

#38为前景 ->> 48为背景 ,使用grays[-1/-2]输出

strline+= color_id #按行写入控制台

print(strline)

img_RGBcolor_ascii(img)

就可以愉快绘图了!

TODO

#https://en.wikipedia.org/wiki/ANSI_escape_code

#opencv:https://docs.opencv.org/3.1.0/de/d25/imgproc_color_conversions.html

def cvtRGB2ITU([r,g,b]):

[r,g,b] = [r,g,b]/255*5

color_v = 16 + 36 × r + 6 × g + b

return color_v

def cvtRGB2ITU(color):

#array combined [0, 95, 135, 175, 215, 255] find the region

color = np.array(color)/40

color_v = color

return color_v

python生成字符图形_【Python AsciiArt】利用命令行打印出字符图案相关推荐

  1. 【Python AsciiArt】利用命令行打印出字符图案

    利用字符串生成工具可以方便的打印出自己想要字符图案,以及如何将图片转换为ASCII ART输出. 最终可以用命令行输出各种彩色图像---->> 一般字符图案 我们在使用一些开源软件的时候, ...

  2. python 生成文字图片_[ImageFont] 如何利用字体生成文字图片

    在OCR识别.检测的数据生成过程当中,我们经常会需要利用字体生成汉字的图片,在Python当中,这一部分的操作通常是通过Pillow 模块提供的ImageFont 模块来完成,下面我们用一个例子,介绍 ...

  3. python myqr制作二维码生成器_用Python生成动态二维码,只要5行代码,拥有你的个性二维码!...

    原标题:用Python生成动态二维码,只要5行代码,拥有你的个性二维码! 前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. P ...

  4. python命令行视频转字符(抖音同款)

    最简单python命令行视频转字符(抖音同款) 可自由选择对比度(ascii_char 代表用到的字符,从像素多到少,字符数越多对比度越低) 使用方法: 1. 将代码中'video_3.mp4'替换成 ...

  5. python路径在哪里设置_找Python安装目录,设置环境路径以及在命令行运行python脚本实例...

    第一点:找Python安装目录 方法一: 方法二: 输入import sys print(sys.path) 化黑线处 第二点:找到安装目录后就可以开始设置环境变量 这里我的安装目录为C:\Progr ...

  6. Python 练习实例23 题目:打印出如下图案(菱形)

    Python 练习实例23 Python 100例 Python 100例 题目:打印出如下图案(菱形): 解答: for i in range(1,5):print(' '*(4-i),end='' ...

  7. php 命令行打印换行符_如何在命令行输出中打印换行符

    php 命令行打印换行符 Surprisingly, getting computers to give humans readable output is no easy feat. With th ...

  8. windows下cmd命令行显示UTF8字符设置(CHCP命令)

    点我进入原文 windows下cmd命令行显示UTF8字符设置(CHCP命令) 在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能 ...

  9. Windows 7 中文版命令行如何修改字符编码为UTF-8?

    Windows 7 中文版命令行如何修改字符编码为UTF-8? CMD 之后,命令行有时候无法显示中文,是乱码,于是我右键查看了编码,是GBK编码.如何修改为UTF-8 如果要更改为 UTF-8,则需 ...

最新文章

  1. 【Web安全】通过机器学习破解验证码图片
  2. Message LongText(消息的详细长文本)
  3. 对mysql优化关注_MySQL优化看这篇就对了
  4. day12_oracle hint——SQL优化过程中常见Oracle中HINT的30个用法
  5. LeetCode 1962. 移除石子使总数最小(优先队列)
  6. JDK1.8 中 ConcurrentHashMap源码分析(一)容器初始化
  7. 简述mysql的事务_请简述为什么要使用数据库的事务
  8. 打造极致Material Design动画风格Button
  9. python3 pyv8 linux,Python 3.4不能安装Pyv8模块
  10. 批处理控制VMware Workstation服务
  11. 阿铭Linux_网站维护学习笔记20190306
  12. 计算机毕设人寿保险项目,2017年中国人寿集团在京各直属单位接收毕业生情况公示...
  13. 大型网站技术架构-核心原理与案例分(李智慧 著)第1章-大型网站架构演化
  14. grub4dos 启动ubuntu 12.04
  15. 通过微博怎么查到IP地址或手机,找到用户具体信息!
  16. numeric_limits用法
  17. 最全Python函数总结和应用(超详细+建议收藏),基本所有内置函数,心得都在这了,踩的坑也在里面了,最后还有函数的魂
  18. 超方便的win10滑动关机
  19. P1638 逛画展(C语言)
  20. 服务器安装宝塔的几个命令

热门文章

  1. Android实现网络音频或视频文件下载本地进行播放
  2. 微软逆天啦,开发出自动揪 Bug 神器
  3. java 多模块引用 程序包 不存在
  4. Tomcat之NIO和APR性能对比
  5. 傻瓜式安装Kubernetes集群
  6. TFS2018-WIK介绍03-VSTS的特有功能,TFS2018中没有的功能
  7. Biome-BGC生态系统模型与Python融合技术实践应用
  8. android 复制u盘文件到手机本地_原来把手机资料传到U盘里这么简单!
  9. cad注释比例和打印比例不一样_什么是cad注释比例?cad注释比例与打印比例为什么会不相等?...
  10. python append函数二维_python创建与遍历List二维列表的方法