Swift 实现图片转字符画的功能
本文介绍一个IOS APP , 将图片转换成ASCII字符画,使用Swift语言编写。
举个例子,我们使用著名的蕾娜照片作为原图片
 
经APP转换后形成的字符画,我们打印出来,效果如下:
 
放大她的脸部可以看到图像都是字符串组成的!
 
项目地址: https://github.com/ijoshsmith/swift-ascii-art
字符画原理
图像中的每个像素都对应到一个ASCII值,在这里显示为一个字符。
 
图像中的每个像素都会被转换成一个中间值,如下所示:
 
让我们一步步来分析。
- 首先,我们将一个像素颜色转换为一个灰度颜色。
 灰度颜色的强度(比如:亮度)是介于0和1的一个值,0代表黑色,1代表白色。
- 接着,把每个颜色的强度值转换为ASCII字符。这对我来说,是最感兴趣的部分,
 AsciiPalette类实现了这部分算法,我们等一下分析。
- 最后,将每行的ASCII字符合并在一起,再将多行字符串合并后就形成了:字符图
算法实现
AsciiArtist类实现了图像到字符画的转换,参考下图中的 31到 33行.
 
AsciiArtist 对象依赖Pixel和 AsciiPalette类, 我们等下分析。
像素转换为灰度颜色
Pixel 类代表图像中的一个像素颜色,一个颜色有4个byte组成,
每个byte代表一个通道(red, green, blue, and alpha)。
AsciiArtist类通过Pixel类确定其颜色的强度值,把像素强度值转换为一个百分数,
让我们看看是怎么实现的:
 
上面代码中的 47 到49行,是标准的像素灰度化转换方法,如果你关心这部分原理,可以参考Grayscale
转换灰度颜色到ASCII字符
AsciiArtist类中的symbolFromIntensity 方法可以转换一个灰度颜色为一个ASCII字符,
我们根据转换后的强度值作为索引,在AsciiPalette对象的字符数组中找到对应的字符,
字符数组是根据颜色强度值从暗到亮排列的。
下面就是我们方法的实现:
 
那么问题是:我们要把哪些ASCII字符放在数组里,按什么样的顺序排列呢?
设计不良的字符数组,会输出不清晰的ASCII字符图:
 
一个良好的字符数组,会生成非常清晰的效果:
 
我的目标是设计一个好的字符数组,使电脑可以绘制出清晰的字符图。
 AsciiPalette 类将字符呈现为一个个图像,在白色的背景上绘制黑色的文本。
我们通过计算ASCII字符图像中白色像素的比率,对字符数组进行排序;白色像素越多,字符对应的强度值越大;空格字符(‘  ’)代表最高强度的值,因为它只包含白色像素,所以排在字符数组的最后。
 
AsciiPalette 类初始化需要一个 UIFont 对象作为参数, 因为选择不同的字体,字符的呈现效果不同,这会影响字符周围有多少白色像素。
源码地址: https://github.com/ijoshsmith/swift-ascii-art
本文译自:Creating ASCII art in functional Swift
本文出处:http://aswifter.com/2015/06/26/creating-ascii-art-in-functional-swift/
转载请在开头注明本文出处。
原文链接:http://www.jianshu.com/p/19d609c79ee5
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
Swift 实现图片转字符画的功能的更多相关文章
- 用函数式的 Swift 实现图片转字符画的功能
		今天整理 Pocket 中待看的文章,看到这篇<Creating ASCII art in functional Swift>,讲解如何用 Swift 将图片转成 ASCII 字符.具体原 ... 
- Python 图片转字符画
		Python 图片转字符画 一.课程介绍 1. 课程来源 原创 2. 内容简介 本课程讲述怎样使用 Python 将图片转为字符画 3. 前置课程 Python编程语言 Linux 基础入门(新版) ... 
- [笔记] Python 图片转字符画
		一.介绍 用Python 代码完成图片转字符画 二.python 环境 Python 3.6.6 pillow 5.1.0 Python 图像处理库, 需要另外安装 三.原理 gray = 0.21 ... 
- Python 图片转字符画 学习笔记
		Python 图片转字符画 学习笔记 标签(空格分隔): Python 声明:此文章和所有代码是学习笔记,非原创,原文教程地址:https://www.shiyanlou.com/courses/37 ... 
- 图片转字符画 【学习ing】
		1.创建ascii.py 2. 下面是 ascii.py 的完整代码: from PIL import Image import argparse #命令行输入参数处理 parser = argpar ... 
- python3----练习题(图片转字符画)
		import argparse from PIL import Image def parse_param(): parser = argparse.ArgumentParser() # 命令行输入参 ... 
- 图片处理拓展篇 : 图片转字符画(ascii)
		首先要明确思路, 图片是由像素组成的, 不同的像素有不同的颜色(rgb), 那么既然我们要转化为字符画, 最直接的办法就是利用字符串来替代像素, 也就是用不同的字符串来代表不同的像素. 另外图片一般来 ... 
- python学习---50行代码实现图片转字符画2
		from PIL import Image codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<> ... 
- python学习---50行代码实现图片转字符画1
		转自:https://blog.csdn.net/mm1030533738/article/details/78447714 项目链接: https://www.shiyanlou.com/cours ... 
随机推荐
- Nth Digit | leetcode
			Find the nth digit of the infinite integer sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... Note: n i ... 
- 加密算法 - RSA
			与DES不同,RSA算法中,每个通信主体都有两个钥匙,一个公钥一个私钥. 就是有2把钥匙1.使用publicKey可以对数据进行加密2.使用Key才能对数据进行解密单方向传输用公钥加密的数据,只有私钥 ... 
- iOS开发之iOS程序偏好设置(Settings Bundle)的使用
			目录[-] 1.添加设置项 2.设置的控件 3.编辑设置项的文件 4.在程序中获取Settings 和写入Settings 添加UI 5.实现读取设置和保存代码 在Android手机上, 在某个程序里 ... 
- REST响应处理
			JAX-RS 2.0 支持4种返回值类型的响应,分别是无返回值.返回Response类实例.返回GenericEntity类实例和返回自定义类实例. 1.在返回值类型是VOID的响应中,其响应实体为空 ... 
- WordPress 全方位优化指南(下)
			上一篇 WordPress 全方位性能优化指南(上)主要从网站性能指标.优化缓存.MySQL 等方面给大家介绍了如何进行 WordPress 性能优化,但还远远不够,毕竟像 WordPress 这样的 ... 
- POJ 2075 Tangled in Cables 最小生成树
			简单的最小生成树,不过中间却弄了很久,究其原因,主要是第一次做生成树,很多细节不够熟练,find()函数的循环for判断条件是 pre[i]>=0,也就是遇到pre[i]==-1时停止,i就是并 ... 
- .net 利用 GZipStream 压缩和解压缩
			1.GZipStream 类 此类在 .NET Framework 2.0 版中是新增的. 提供用于压缩和解压缩流的方法和属性 2.压缩byte[] /// <summary> /// 压 ... 
- 【转】Xcode7.1环境下上架iOS App到AppStore 流程 (Part 三)
			原文网址:http://www.cnblogs.com/ChinaKingKong/p/4964745.html 前言部分 part三 部分主要讲解 Xcode关联绑定发布证书的配置.创建App信息. ... 
- 12篇学通C#网络编程
			转自:http://www.cnblogs.com/huangxincheng/archive/2012/01/03/2310779.html 在C#的网络编程中,进程和线程是必备的基础知识,同时也是 ... 
- android学习之BUG——The connection to adb is down, and a severe error has occured.
			开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ... 
