1. 程式人生 > >牛逼的AA:ASCII-Art

牛逼的AA:ASCII-Art

也許你還不知道AA是什麼,但只看那牛逼哄哄的名字,就該知道它絕非善類。

1.將所有的重要軟體移植到AA-lib

2.將AA-lib移植到所有的可用平臺

3.迫使IBM重新制造MDA卡

注:MDA(Monochrome Display Adapter ),單色字元顯示適配卡,與單色字元顯示器配接,它只支援字元顯示功能,無圖形功能,是一種相當古老的顯示卡。

簡單的說,它可用實現下面的效果,就是將圖片轉換為ASCII文字。


這個略顯粗糙,如果將字型調小,增大解析度,可顯示更加逼真的圖片,例如:


其實,這是一個由ASCII字元的狂熱愛好者們開發的專案,最初的發起人叫Jan Hubicka,目的是將計算機上的一切都用ASCII字元來表現,包括圖形和視訊。

該專案提供了一個庫——AA-lib,這是一個低階圖形庫,與其他的庫的區別是它不需要圖形裝置,完全用ASCII字元描繪圖形,它的API被設計得與其他庫類似。還提提供一個演示程式——BB(這個名字更顯另類),播放了一段完全由ASCII字元繪製的動畫,其中有文字,影象,分形幾何,還有一個3D效果。

下面在fedora12中安裝它們。

1.安裝AA-lib

下載aalib-1.2:

最新版本是1.4,但是BB是基於1.2的,所有先安裝1.2。

解壓、編譯、安裝:

tar  xvzf aalib-1.2.tar.gz
cd  aalib-1.2
./configure
make
make install

預設安裝在/usr/local下

2.安裝bb

下載bb-1.2:

編譯前需要設定一個環境變數,否則會找不到aa-lib:

export CFLAGS=-I/usr/local/include

解壓:

tar xvzf bb-1.2.tar.gz
cd aalib-1.2

編譯時會報textform.c檔案的錯誤,是因為該檔案內定義的某些字串太長,換行時沒有用反斜槓,可以在後面加上反斜槓,或直接註釋掉。然後編譯:

./configure
make

編譯生成了可執行檔案bb,直接執行即可看到一段演示。最好在文字模式下執行,否則可能會報錯。

這段演示還可以新增音樂,在原始碼的mikunix目錄下有音訊的程式,直接make,然後執行strip ../bb_snd_server。但是我一直沒有弄出聲音,也許是虛擬機器的問題。

3.安裝aview

aview的作用是將pnm格式的圖片轉換為ASCII文字,並顯示。aview只支援pnm、pgm、pbm和ppm格式的圖片,所以需要將其他格式的圖片轉換,它提供了一個asciiview的指令碼,利用convert轉換圖片格式,然後再傳遞給aview。

aview依賴於aalib-1.4,所有要先用1.4替換之前安裝的1.2,安裝方法與1.2相同。安裝後下載aview:

解壓、編譯、安裝:

tar xvzf aview-1.3.0rc1.tar.gz
cd  aview-1.3.0
./configure
make
make install

編譯生成的aview程式可以將pbm、pgm或pnm圖片用ASCII字元顯示。但是不支援JPEG圖片,所以它提供了一個shell指令碼asciiview,先呼叫convert將JPEG圖片轉換為pgm圖片,然後再用aview顯示。

fedora12中沒有convert命令,先用下面的命令安裝:

yum  install  ImageMagick

準備一張圖片,例如1.jpg,用下面的命令就可以把它轉換為ASCII文字:

asciiview  1.jpg

4.Bad Apple

下面參考aview的原始碼,編寫了一個程式,在Linux的終端下播放一段由ASCII字元繪製的動畫:Bad Apple。原理比較簡單,就是將視訊逐幀截圖,然後用程式按一定的時間間隔將圖片依次轉換為ASCII文字在終端上顯示。動畫視訊在這裡:http://v.youku.com/v_show/id_XMzYwNTIyODY4.html,動畫中的卡頓是螢幕錄影軟體的問題,AA-lib本身是很流暢的。

製作步驟:

準備apple.flv,用kmplayer做每50毫秒截圖,截圖為jpeg格式,把它們都複製到/root/aa/img目錄下。

用下面shell指令碼將jpeg圖片轉化為pgm格式,共3202張,檔名為1.pgm到3202.pgm,全部放在pgm資料夾下。

#!/bin/sh
ls -l *.jpg > sort
i=1
while [ $i -le 3202 ]
do
    filename=`sed -n ''$i'p' sort | awk '{print $8}'`
    echo $filename
    convert $filename ./pgm/$i.pgm
    i=`expr $i + 1`
done

在pgm資料夾下執行程式:

./aviewdemo -contrast 20 -extended 1.pgm