IOS培训
美国上市IOS培训机构

400-111-8989

热门课程

达内培训老师分享iOS教程

  • 时间:2016-10-14
  • 发布:iOS培训
  • 来源:IOS开发教程

达内ios培训技术老师教你如何用Swift将图片转成ASCII字符?下面开始学习了哦!

Pixel

图片是由各个像素点组成的,在代码中像素通过Pixel这个struct实现。每个像素分配了4个字节,这4个字节(2^8 = 256)分别用来存储RBGA的值。

reatePixelMatrix

可以通过createPixelMatrix这个静态方法创建一个width * height像素矩阵:

和传统方法中使用for循环来创建多维数组有所不同的是,这里是通过map函数实现的。在Swift 2.0中, map函数已经被干掉了,只能作为方法调用。

intensityFromPixelPointer

intensityFromPixelPointer方法计算并返回像素点的亮度值,代码如下:

alculateIntensity方法基于Y’UV编码获取某个像素的亮度(intensity) :

YUV是一种颜色编码方法,Y表示亮度, UV用来表示色差, U 和V是构成彩色的两个分量。它的优点是可以利用人眼的特性来降低数字彩色图像所需要的存储容量。我们通过这个公式获取到的Y就是亮度的值。

Offset

Pixel中其实只存了一个值: offset 。 Pixel.createPixelMatrix创建出来的矩阵是这样的:

并没有像想象中那样存储了每个像素相关数据,而更像是一个转换工具,计算PixelPointer的灰度值。

AsciiArtist

AsciiArtist里封装了一些生成字符画的方法。

createAsciiArt

createAsciiArt方法就是创建字符画:

其中CFDataGetBytePtr函数返回了图像的字节数组指针,数组里每个元素都是一个字节,即0~255的整数。每4个字节组成了一个Pixel ,分别对应着RGBA的值。

intensityMatrixFromPixelPointer

intensityMatrixFromPixelPointer这个方法是通过PixelPointer生成对应的亮度值矩阵:

首先通过Pixel.createPixelMatrix方法创建了一个空的二维数组,用来存放数值。然后用两个map嵌套遍历里面的所有元素,将像素(pixel)转换成亮度(intensity)的值。

symbolMatrixFromIntensityMatrix

symbolMatrixFromIntensityMatrix函数将亮度值数组转换成字符画数组:

map + reduce成功实现了字符串的累加,每次reduce都是通过symbolFromIntensity方法获取到亮度值对应的字符。 symbolFromIntensity方法如下:

传入intensity ,在确保了值的范围是0 ~ 1之后,通过AsciiPalette将它转换成对应的字符,输出sumbol AsciiPaletteAsciiPalette是用来将数值转换成字符的工具,像是一个字符画里的调色板一样,根据不同的颜色生成字符。

loadSymbols

loadSymbols加载了所有的字符:

可以看到,我们选用的字符范围是32 ~ 126的字符,接下来就是通过symbolsSortedByIntensityForAsciiCodes方法将这些字符按照亮度进行排序。比如&符号肯定代表着比.暗的区域,那么它是如何比较的呢?请看排序方法。

symbolsSortedByIntensityForAsciiCodes

symbolsSortedByIntensityForAsciiCodes方法实现了字符串的生成和排序:其中, sortByIntensity这个排序方法如下:

达内ios培训技术老师做出小结

简单了过了一下项目,可以隐约感觉到一些函数式风格的气息,主要体现在一下几个方面:

map reduce等函数的应用恰到好处,自如处理数组的转换和拼接。

通过input和output进行数据处理,比如sortByIntensity方法和symbolFromIntensity方法。

很少有状态和属性,更多的是直接的函数转换,函数逻辑不依赖外部变量,只依赖于传入的参数。

上一篇:Swift中的变量和常量
下一篇:ios开发学习指南-Objective-C代码规范

IOS开发中的这些权限,你搞懂了吗?

IOS开发CPU/GPU消耗原因分析和解决办法

iOS开发可以用到的mac命令

iOS App 审核被拒的13个原因

选择城市和中心
贵州省

广西省

海南省

台湾