用Golang將圖片轉化成ASCII碼

用Golang將圖片轉化成ASCII碼

在開始以前先看看最終效果:linux

圖片描述

項目地址在這裏:https://github.com/qeesung/im... , 歡迎stargit

咱們都知道圖片是經過一個像素點矩陣組成的,每個像素點都是有四個值,分別是R,G,B,A組成,其中RGB就是紅色,綠區,藍色,簡稱三原色,在計算機中取值從0-255,而A則是顏色的透明度,取值0.0-1.0。github

圖片描述

咱們如今要作的就是將一個彩色的圖片轉化成一個由ASCII組成的圖片,換句話說,就是將RGBA像素點的矩陣轉化成一個由字符組成的矩陣,必要的時候再給字符加上顏色就能夠啦。bash

(R, G, B, A) (R, G, B, A) (R, G, B, A)        char1, char2, char3
(R, G, B, A) (R, G, B, A) (R, G, B, A)  -->   char4, char5, char6
(R, G, B, A) (R, G, B, A) (R, G, B, A)        char7, char8, char9

那麼問題又來了,R,G,B的值都是從0-255的,而字符的數量是頗有限的(通常咱們只會用少數幾個有限的字符來表示),那麼咱們如何將由多種組合的R,G,B映射到一個字符上呢?ui

convert(pixel) -> character

咱們不妨將RGB值和透明度和在一塊兒,算出一個總值權重W,而後將這個值W均分到不一樣的字符串上,這樣就完成了像素點到字符的映射,就是這麼簡單。注意下面的可選字符串的從左往右" .,:;i1tfLCG08@"辨識度一次增長,或者辨識度依次減小,若是不這樣作,那麼圖片識別出來效果可能不太行。spa

value := (r + g + b) * a / 255

// Choose the char options.Pixels = " .,:;i1tfLCG08@"
precision := float64(255 * 3 / (len(options.Pixels) - 1))
rawChar := options.Pixels[roundValue(float64(value)/precision)]

如今能夠將像素轉化爲字符了,那麼顏色怎麼辦?上面的操做比如只是把圖片轉化成了黑白的,而後把輪廓畫出來來了,那麼如何取顏色呢?3d

加顏色須要注意的是,如今的顏色再也不是單單的顏色了,如今的顏色包含兩塊,一塊是字符自身的顏色,即前景色,一塊是字符的後面的顏色,即背景色。code

咱們這裏不調整背景色,只渲染字符的前景色,即只渲染字符的顏色。blog

在linux終端中,是能夠經過輸出特殊字符來配置輸出字符顏色的,拿着就好辦了,只需用圖片的RGB混合一下,輸出顏色就能夠了,咱們這裏用http://github.com/aybabtme/rg...圖片

func decorateWithColor(r, g, b uint64, rawChar byte) string {
    coloredChar := rgbterm.FgString(string([]byte{rawChar}), uint8(r), uint8(g), uint8(b))
    return coloredChar
}

圖片描述

更多源碼細節能夠看這裏: https://github.com/qeesung/im... 歡迎star👏

相關文章
相關標籤/搜索