本文介紹一個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/
轉載請在開頭注明本文出處。
歡迎關注我的微信公眾號,分享Swift開發(fā),Android 開發(fā)和互聯網內容
微信號:APP開發(fā)者
