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 對象依賴PixelAsciiPalette類, 我們等下分析。

像素轉換為灰度顏色

Pixel 類代表圖像中的一個像素顏色,一個顏色有4個byte組成,
每個byte代表一個通道(red, green, blue, and alpha)。
AsciiArtist類通過Pixel類確定其顏色的強度值,把像素強度值轉換為一個百分數,
讓我們看看是怎么實現的:


上面代碼中的 47 到49行,是標準的像素灰度化轉換方法,如果你關心這部分原理,可以參考Grayscale

轉換灰度顏色到ASCII字符

AsciiArtist類中的symbolFromIntensity 方法可以轉換一個灰度顏色為一個ASCII字符,
我們根據轉換后的強度值作為索引,在AsciiPalette對象的字符數組中找到對應的字符,
字符數組是根據顏色強度值從暗到亮排列的。
下面就是我們方法的實現:

symbol_from_intensity
symbol_from_intensity

那么問題是:我們要把哪些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ā)者

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 最近需要給直播項目中添加美顏的功能,調研了很多SDK和開源代碼(視決,涂圖,七牛,金山云,videoCore等),...
    未來的路就在那閱讀 2,201評論 1 1
  • 01 在前幾天,我左手一個箱子,右手一個箱子,大包小包的又一次橫穿半個中國。 火車在凌晨5點50分到達首都北京,熟...
    Jessica時間櫥窗閱讀 560評論 0 2
  • 不要過度解讀 結構宏觀把握 題目選項每個字都要看
    orange1027閱讀 278評論 0 0
  • 不知道生活中有沒有發(fā)現,我們身邊有一些人有迷之優(yōu)越感,甚至連我自己有時候也會產生這種莫名其妙的優(yōu)越感。反正我所了解...
    佛系肉團閱讀 1,865評論 0 2
  • 1、excursion n.(尤指集體)遠足;短途旅行,游覽;離題;[機]沖程 辨析: excursion → 較...
    rhythmmm閱讀 493評論 0 0

友情鏈接更多精彩內容