Convert Picture or Video to ascii

本文深入探讨了ASCII艺术的历史、应用以及技术实现方法,包括利用Linux下的AA-lib库将图片和视频转换为ASCII文本,展示如何通过命令行工具和脚本进行自动化处理,以及在不同场景下的应用案例。

一个利用ascii拼成的谷歌街景地图! http://tllabs.io/asciistreetview/,看上去效果真不错!

除此之外,linux下面也有类似的ascii艺术,比如 aview/asciiview ,mplayer

其中mplayer的使用方法 

?
1
mplayer -vo caca *.flv

http://blog.youkuaiyun.com/exbob/article/details/7321903

也许你还不知道AA是什么,但只看那牛逼哄哄的名字,就该知道它绝非善类。

没错。进入这个项目的主页:http://aa-project.sourceforge.net/ ,就能看到它的三个宏伟目标:

1.将所有的重要软件移植到AA-lib

2.将AA-lib移植到所有的可用平台

3.迫使IBM重新制造MDA卡

注:MDA(Monochrome Display Adapter ),单色字符显示适配卡,与单色字符显示器配接,它只支持字符显示功能,无图形功能,是一种相当古老的显卡。

如果你对技术不感兴趣,可用点击这里http://v.youku.com/v_show/id_XMzYwNTIyODY4.html,观看利用AA制作的一段动画,制作方法和源代码在文档的最后一节。 

简单的说,它可用实现下面的效果,就是将图片转换为ASCII文本。


这个略显粗糙,如果将字体调小,增大分辨率,可显示更加逼真的图片,例如:


其实,这是一个由ASCII字符的狂热爱好者们开发的项目,最初的发起人叫Jan Hubicka,目的是将计算机上的一切都用ASCII字符来表现,包括图形和视频。

该项目提供了一个库——AA-lib,这是一个低级图形库,与其他的库的区别是它不需要图形设备,完全用ASCII字符描绘图形,它的API被设计得与其他库类似。还提提供一个演示程序——BB(这个名字更显另类),播放了一段完全由ASCII字符绘制的动画,其中有文字,图像,分形几何,还有一个3D效果。

下面在fedora12中安装它们。


1.安装AA-lib

下载aalib-1.2:

http://prdownloads.sourceforge.net/aa-project/aalib-1.2.tar.gz

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

解压、编译、安装:

[python]  view plain copy
  1. tar  xvzf aalib-1.2.tar.gz  
  2. cd  aalib-1.2  
  3. ./configure  
  4. make  
  5. make install  

默认安装在/usr/local下


2.安装bb

下载bb-1.2:

http://prdownloads.sourceforge.net/aa-project/bb-1.2.tar.gz

编译前需要设置一个环境变量,否则会找不到aa-lib:

[python]  view plain copy
  1. export CFLAGS=-I/usr/local/include  

解压:

[python]  view plain copy
  1. tar xvzf bb-1.2.tar.gz  
  2. cd aalib-1.2  

编译时会报textform.c文件的错误,是因为该文件内定义的某些字符串太长,换行时没有用反斜杠,可以在后面加上反斜杠,或直接注释掉。然后编译:

[python]  view plain copy
  1. ./configure  
  2. 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:

http://prdownloads.sourceforge.net/aa-project/aview-1.3.0rc1.tar.gz

解压、编译、安装:

[python]  view plain copy
  1. tar xvzf aview-1.3.0rc1.tar.gz  
  2. cd  aview-1.3.0  
  3. ./configure  
  4. make  
  5. make install  

编译生成的aview程序可以将pbm、pgm或pnm图片用ASCII字符显示。但是不支持JPEG图片,所以它提供了一个shell脚本asciiview,先调用convert将JPEG图片转换为pgm图片,然后再用aview显示。

fedora12中没有convert命令,先用下面的命令安装:

[python]  view plain copy
  1. yum  install  ImageMagick  

准备一张图片,例如1.jpg,用下面的命令就可以把它转换为ASCII文本:

[python]  view plain copy
  1. 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文件夹下。

[python]  view plain copy
  1. #!/bin/sh  
  2. ls -l *.jpg > sort  
  3. i=1  
  4. while [ $i -le 3202 ]  
  5. do  
  6.     filename=`sed -n ''$i'p' sort | awk '{print $8}'`  
  7.     echo $filename  
  8.     convert $filename ./pgm/$i.pgm  
  9.     i=`expr $i + 1`  
  10. done  

在pgm文件夹下执行程序:

[python]  view plain copy
  1. ./aviewdemo -contrast 20 -extended 1.pgm  

程序源码在这里:http://download.youkuaiyun.com/detail/exbob/4112093 

动画视频在这里:http://v.youku.com/v_show/id_XMzYwNTIyODY4.html 



用 mplayer 来播放

其实把电影当成字符来播放根本就不是什么新玩意,mplayer 早就有这个功能

mplayer -vo aa -monitorpixelaspect 0.5 filename

因为 aa 输出驱动不能保持正确比例(mplayer 的 -aspect 参数),改用 -monitorpixelaspect 0.5 后比例比较正常。它也有一些快捷键

  • 12 键为控制对比度
  • 34 键控制亮度
  • 5 键切换快速渲染
  • 6 键切换抖动方式
  • 7 键反转效果
  • a 键则是切换回mplayer控制方式

把 aa 换成 caca 就是彩色输出。不过 Ubuntu 9.10 自带的 mplayer 没有把这个 aa 视频输出驱动编译进去,medibuntu 的版本就有,搞错,应该是 SMPlayer作者编译的版本。用 Ubuntu Tweak 添加个第三方源更新下 mplayer 就行,最版版本中名为「Mplayer」的源好像又被移除了,手动添加 ppa 源页面

mplayer 使用的是 aa-project 项目 的 aalib 库(在 Ubuntu 字改成「libaa」),看看更新历史,1998 年 3 月 10 日第一版,最后更新 2001 年 4 月 25 日,这东西是非常非常古老的,那个年代的 hacker 玩 ascii-art 真是想多变态就能玩多变态。这玩意是 Linuxer 装逼必备的,各位装逼犯们,有兴趣想知道怎么做继续看下去。

注意: 下面的写的都是在 Linux 下完成的,只用到 mplayer、aview 和一些 Linux 命令,Windows 用户需要自找代替工具,但原理是一样的。额外使用的工具、代码和最终结果文本可以 猛击这里 下载。

更新: 留言中的 jiazhoulvke 同学 写了个 shell 脚本,自动完成下文的一系列操作,使用简单,不想理解原理来折腾的可以下载来看看,里面有使用说明。

Vim 来播放

mplayer 的播放原理不难理解,mplayer 解码视频,把每一帧传给 libaa 来生成 ascii 文本,再把 ascii 文本转换成图像传给 X 显示出来。现在不用 mplayer 转换图像来播放了,把 libaa 转换过后的 ascii 文本弄出来,用 Vim 来播放。

可是想通过 mplayer 把这些字符提取出来没那么简单,因为它没有提供直接输出文本的选项,所以得换个思路,如下

先用 mplayer 来把视频的每一帧保存为图像,mplayer 支持 png 和 jpg 输出,经过测试,png 不压缩体积巨大,压缩速度又慢,反正这里的视频本来就是黑白的,不用那么高要求,jpg 就够了,体积也很理想。

然后再用其它工具来把图像转换 ascii 文本,这里找到一个,是 LDCN 介绍过 aview ,通过 manpage,发现也是用 libaa 库,连选项都是跟 mplayer 的一样。

再把转换后的文本合并为一个。

用 Vim 来打开合并后文件,编写脚本实现自动翻页。

准备工作

先建立一个空的临时文件夹,把 flv 文件复制进去,源视频用 Flashgot 从 这个页面 抓下来的,用 SMPlayer 看一下 flv 的信息

  • 文件名:bad_apple.flv
  • 大小:6M
  • 分辨率:448x336
  • 帧速:15fps

文件不算大,还是黑白的,更方便转成 ASCII 了。接下来的都是终端操作了,先建立几个工作目录。

mkdir jpg pgm txt

提取图像

执行下面的命令,所有帧都会输出为 jpg 放到 jpg 目录下

cd jpg
mplayer -vo jpeg ../bad_apple.flv

转换也很快,不过最好不要打开文件管理器来看啊哈,几千文件在里面。转换后 3283 个文件共 20.6MB。

转换为 pgm

把图像转换为 ASCII 文本的工具是 aview,就在 aview 这个包里,在安装(这时还不需要安装)后用 asciiview 来查看图像。

为什么不是用 aview 呢?那是因为 aview 只支持 pnm、pgm、pbm、ppm 的格式,对于常见的 png 和 jpg 不支持,怎么办呢?转换一下咯,所以就有了 asciiview 这个脚本,它的作用就是先把图像转换成 pgm 格式再调用 aview 来显示。它用的是 imagemagick 的 convert 命令,但这里不用 asciiview 了,直接自己先转换好了。继续在 jpg 目录下执行

for i in *.jpg; do convert -colorspace gray $i ../pgm/${i%.jpg}.pgm; done

经过漫长的等待后,在 pgm 目录出现一堆 pgm 文件了,图像变成灰阶图形,体积增大至 471.3MB。

转换成 ASCII

这时候就能把 pgm 转换成 ascii 文本了,郁闷的是 aview 不支持直接在命令行直接输出结果,我翻遍它的文档都找不到相应的选项,所以如果你想保存结果,得用 aview 打开,按 s 键,然后答几个问题,如保存高宽度啊,字体啊,文件名啊这些问题。娘啊,我可是有 3 千多个要转换啊,手动保存得何年何月啊?

下面两个方法选一个

旧方法:修改aview源码重新编译

这里省略千字的折腾过程,最后我是下载源码来修改 aview 来实现这个功能的,改过的 aview 命名为 aview-mod。用 aview-mod 来把 pgm 转换为 txt,执行下面命令

cd ../pgm
for i in *.pgm; do aview-mod -driver stdout -contrast 32 $i | sed '$d' > ../txt/${i%.pgm}.txt; done

新方法: 脚本处理,推荐

其实 aview 也支持命令行输出,只不过用法比较诡异,而不是直接输出单张结果,而是一个空白页和 2 张 ASCII 页面,所以要配合 sed 再处理一下,截取其中一张

cd ../pgm
for i in *.pgm; do echo q | aview -driver stdout -kbddriver stdin -contrast 32 $i | sed -n '27,+24p' > ../txt/${i%.pgm}.txt; done

那堆 txt 齐刷刷地放到 txt 文件夹下,一共 6.3 MB。

合并文本

无难度

cd ../txt
cat *.txt > ../bad_apple.txt

Vim 翻页脚本

需要写一个脚本来实现自动翻页,在 Vim 的丰富文档帮助下,不用研究多久就写出来了。每隔 67 毫秒向下移动 25 行,因为 1000ms/15fps=67,一共有 3283 个 txt。脚本名为 ascii_player.vim。

function! AsciiPlayer()
    set nowrap
    set scrolloff=0
    set columns=80
    set lines=26
    normal gg
    let i = 1
    while i < 3283
        execute "normal 25\<CR>zt"
        redraw
        let i = i + 1
        sleep 67m
    endwhile
endfunction
command! AsciiPlayer call AsciiPlayer()

运行脚本

用 Vim 打开 bad_apple.txt,执行两条 Ex 命令

:source ascii_player.vim
:AsciiPlayer

就可以欣赏了,哇哈哈哈,一种无法抵挡装逼感油然而生。

一些补充

当然你也可以用 gvim 来看,可惜刷新太慢,像放幻灯片。而在终端下 vim 翻页可是嗖嗖的,非常流畅。

其实也不一定用 vim 来看,也可以是其它程序,只要它能实现定时自动翻页,刷新够流畅就可以。

这里用的是终端默认大小,即 80x25,当然也可以更大,但你的硬盘也得够大,libaa 也有不少参数可选。

这里用的例子视频默认是黑白的,如果是彩色的,有个东西叫 二值化 ,GIMP 有这个功能,把彩色图像换成失真度较低的黑白图像是个体力活。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值