使用 C# 创造 ASCII 艺术
你见过那些很酷的“字母”艺术吗?用一些英文字母和符号组成某种文字或图像的?有些人尝试逐个字母地创建这种艺术,但今天我们将自己实现它!
什么是 ASCII 艺术?
基本上,ASCII 艺术是一种基于文本的艺术形式。程序或文档中使用的艺术文字或文本,由取自 ASCII 字符的字符和符号组成。
什么是ASCII:https://en.wikipedia.org/wiki/ASCII
它是如何工作的?
好问题!
为了解释这一点,我们必须了解图像是由什么组成的。
图像,更具体地说,数字图像由像素组成,基于该图像的分辨率。
因此,分辨率为 400 * 600(高\宽)的图像有 240000 像素。像素是数字图像的最小组成部分。每个像素都可以包含有关该像素颜色的数据,像素有不同数量的位来表示它们,其中每个位代表一个颜色选项
1 bpp,2^1 = 2 种颜色(单色)
2 bpp,2^2 = 4 种颜色
3 bpp,2^3 = 8 种颜色
4 bpp, 2^4 = 16 色
8 bpp,2^8 = 256 色
16 bpp, 2^16 = 65,536 色(“ 高彩色 ”)
24 bpp, 2^24 = 16,777,216 色(“真彩色”)
高彩色:https://en.wikipedia.org/wiki/Highcolor
真彩色:https://en.wikipedia.org/wiki/24-bit_color
那么我们如何构造颜色呢?
有多种方法可以使用颜色空间定义颜色,其中最流行的一种是 sRGB。
sRGB 代表标准红绿蓝,是一种色彩空间,或一组特定颜色,由惠普和微软于 1996 年创建,目标是标准化电子产品所描绘的颜色。
换句话说,红色、绿色和蓝色的组合将产生不同的颜色。每个值的范围可以在 0 到 255 之间,因此以颜色表示为例:
(R:255,G:0,B:0) = 红色
(R:0,G:255,B:0) = 绿色
(R: 0,G:0,B:255) = 蓝色
(R:255,G:255,B:255) = 白色
(R:0,G:0,B:0) = 黑色
(R:100,G:100 ,B:100) = 灰色
让我们进入代码实现。
将图像打印为 ASCII 艺术
假设,我们想将此图像转换为 ASCII 艺术:
可爱的小狗
请注意,我们有图片的某些部分较暗,有些部分较亮。这正是我们在创建 ASCII 艺术时想要模拟的,一些字符可以代表一个暗像素,例如空格“”或点“.”。有些可以代表一个亮像素,例如“@”或“W”,但我为什么要专门选择这些?这其实很容易理解,字母越密,在深色背景上会显得越亮对吧?
所以让我们定义我们的“调色板”:
string asciiChars = " .,:ilwW@@";
这些字母必须按它们的密度排序,才能正常工作。
假设我们有一个像素,并且我们知道它是 RGB 值,我们如何将其转换为 ASCII 字符,如果我们查看它的灰度颜色,将更容易理解像素的亮或暗。灰度色调可以由 RGB 值的平均值生成。
例如,红色 (255,0,0) 灰度表示为 (85,85,85)。
从这部分开始,剩下要做的就是取平均值并在我们之前创建的字符数组中获取它的位置。
因此,如果颜色平均值有[0,255]种可能,而ASCII字符只有[0,10]种可能,我们想要在我们选择的ASCII字符数组中取这个颜色值的相对部分,
我们在字符数组中放入的字母越多,我们就会有更多的可能性来代表我们的亮度值。
我不想表示出每个像素,因为像素太多了。所以我调整了图像的大小以匹配 130 像素的宽度。
最终结果:
这太棒了!
不过我还需要改变字体,使字母之间的间距均匀,并微调行高,以使图片显示在正确的尺寸,而不是看起来像被压扁了。
它也适用于视频吗?
然后我想到了,视频基本上是数字图像的集合!如果我修改我的代码,以从一个短的 mp4 视频文件中提取帧如何呢?
这是可能的,我只需要找到一种方法来提取帧,并重用我的代码。于是我找到了一个名为 NuGet Gallery | Emgu.CV 图像处理库的跨平台 .NET 包装器。
NuGet Gallery | Emgu.CV :https://www.nuget.org/packages/Emgu.CV/
为了减少控制台写入闪烁,我收集了需要插入到字符串构建器对象中的每个字符,并且在完成处理每一帧的像素时,我将该 StringBuilder 值推送到控制台中。并将控制台光标定位到文本的开头
看看这个:
是不是很酷!
最后一步
最后一步,我们可以实时解析视频吗?
使用同一个库,可以轻松地将视频捕获设置为网络摄像头,并将自己视为一堆“W”和“@”和“。”
快乐学习!
☆ END ☆
如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。
↓扫描二维码添加小编↓
使用 C# 创造 ASCII 艺术相关推荐
- 一些你不知道的好玩的有趣的linux命令 Linux终端下的ASCII艺术
你知道吗?其实在linux 终端下也是可以玩一些简单的ASCII字符动画.每次提起linux 都觉得害怕,因为那些命令太古板太严肃了.嘿嘿,从现在开始,貌似有点乐趣了哦.当你敲代码敲累了,你可以玩玩这 ...
- 如何从任何图像创建自己的自定义ASCII艺术
Creating pictures from monospaced ASCII characters may be useless, but it sure is fun! If you've got ...
- Linux终端上如何将图像转换成 ASCII 艺术
想在 Linux 终端中做一些有趣的事情吗?把一张普通的图片转换成 ASCII 艺术怎么样?来看一下. 想在 Linux 终端中做一些有趣的事情吗?把一张普通的图片转换成 ASCII 艺术怎么样? 你 ...
- ASCII-Generator.site在线生成ASCII艺术字符图
什么是 ASCII-Generator.site ? ASCII-Generator.site 是一个 Django 网站,用于从图像或文本中生成 ASCII 艺术字符图
- gif转换为ASCII艺术
一个有趣的谷歌的项目,可以将gif转换为ASCII艺术 地址: https://github.com/google/gif-for-cli gif-for-cli logo 接收GIF,短视频或查询[ ...
- linux 图片 ascii,asciiviewer - 将图像转换为ASCII艺术
由于终端仅限于文本,因此像asciiviewer这样的工具通常可用于从纯文本生成图像. 要做到这一点,你需要一个名为asciiviewer的工具. aview/asciiview是一个图像查看器,以A ...
- Monodraw Mac版 v1.6.1 ASCII 艺术编辑器 兼容 M1
Monodraw 允许您轻松创建基于文本的艺术(如图表.布局.流程图)并直观地表示算法.数据结构.二进制格式等.因为它只是文本,所以几乎可以在任何地方轻松嵌入.当然,也支持导出为图像(PNG 和 SV ...
- Rust Wasm 图片转 ASCII 艺术
有一些隐藏在代码中的 ASCII 有意思的图片,如: /*__ooOoo_o8888888o88" . "88(| -_- |)O\ = /O____/`---'\____.' \ ...
- 在java中的ascii_在Java中绘制ASCII艺术
嗨,我想绘制一个带*的正方形作为轮廓,点的大小在4-20范围内. ***** *...* *...* *...* *****我很难让高度与长度相等. 这是我的代码,请你帮忙..谢谢 class Mai ...
最新文章
- myeclipse按.自动提示方法
- 如何配置MySQL?(三)
- keras inceptionv1 到 inceptionv4演化
- python时间函数详解_Python:Numpy库基础分析——详解datetime类型的处理
- 基于Nexys4DDR的数字时钟设计
- osql sql2012_您可能不知道SQL Server实用程序-SQLdiag,osql和SqlLocalDB
- it招聘上说熟悉linux系统,运维入门:细说Linux,做IT必看
- Fortran入门教程(三)——输入输出
- torch.nn.Module.buffers(recurse=True)
- 提供一个在Selenium截网页长图的实现
- 输入日期得出星座c语言,C++输入日期 判断所属星座
- mysql 设置 utc_关于时间:MySQL应该将其时区设置为UTC吗?
- android 获得屏幕方向,Android 获取设置屏幕横竖屏
- 用手机怎么连接服务器?如何用手机远程连接服务器?
- oracle 10g 与11g的几点常用区别
- mysql5.6 安装配置 老系统_Windows系统 Mysql5.6下载安装以及配置
- CDSS十年回望及未来展望
- 计算机一级考试wps知识点,计算机一级考试wps练习题
- 学java用孙悟空_悟空老师会出Java实战课麽?期待...
- 儿童上网时间管控软件_GreenSurfOnline V0.1 使用说明 (以Windows后台服务形式存在,安装需要有一定电脑操作基础)...
热门文章
- 项目总结——新闻编辑器
- ALO_DELM 蚁狮算法优化深度极限学习机回归预测算法
- 让curl命令支持http2
- Azure传输vNet实现Hub-Spoke模型S2S连接
- Metasploit(MSF)实战_永恒之蓝漏洞拿下win7靶机
- Kali运行smod框架报错‘Conf‘ object has no attribute ‘use_dnet‘
- spring boot mail 发送邮件,及25端口更换到465端口
- 文本视图TextView
- 春节之缅怀系列-Linux操作系统之父 Linus Benedict Torvalds
- Java实现 LeetCode 491递增子序列