Convert Picture or Video to ascii

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

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

其中mplayer的使用方法 

?
1
mplayer -vo caca *.flv

http://blog.csdn.net/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.csdn.net/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 有这个功能,把彩色图像换成失真度较低的黑白图像是个体力活。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值