Convert Picture or Video to ascii

2023-05-16

一个利用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 有这个功能,把彩色图像换成失真度较低的黑白图像是个体力活。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Convert Picture or Video to ascii 的相关文章

随机推荐

  • 测试git能否连接github

    welcome to my blog 使用以下命令进行测试 ssh T git 64 github com 出现报错 ssh dispatch run fatal Connection to 13 250 177 223 port 22 S
  • vtk中实现3D模型(读取文件)

    xff08 xff09 VTK 坐标系统及空间变换 窗口 视图分割 mb5fed73533dfa9的技术博客 51CTO博客 VTK学习 xff08 三 xff09 VTK读取序列图像 灰信网 xff08 软件开发博客聚合 xff09 读取
  • centos中安装Python2.7

    转载于 xff1a 秋水逸冰 CentOS 6 8安装Python2 7 13 查看当前系统中的 Python 版本 python version 返回 Python 2 6 6 为正常 检查 CentOS 版本 cat etc redha
  • 安装tar.gz文件(无configure文件)

    如何安装tar gz文件 xff08 以webstorm为例 xff09 1 获取root权限并输入密码 xff1a su root 2 进入有该文件的目录下 xff08 以我的为例 xff0c 具体看你的文件在哪里 xff09 cd 下载
  • 游戏服务端框架之业务线程模型

    请求消息绑定线程策略的选择 在上一篇文章中 我们看到 消息是直接在网络框架的io线程中处理的 这样做有一个非常严重的缺陷 如果业务处理比较耗时 那么io线程接受消息的速度就会下降 严重影响io的吞吐量 典型的 我们应该另起线程池 专门用于异
  • 在WSL中使用GPU:WSL2 + Ubuntu 18.04 + CUDA + Gnome图形界面环境配置

    目录 引言1 确认Windows 10版本2 在Windows上安装WSL23 在Windows上安装CUDA on WSL驱动4 在WSL2中安装CUDA Toolkit3 测试CUDA是否能在WSL2中运作4 安装Gnome图形界面其他
  • Centos 开启路由转发实现全网互通

    只需在RouterSrv网关服务器上开启路由转发功能即可 root 64 RouterSrv vi etc sysctl conf net ipv4 ip forward 61 1 添加此行即可 root 64 localhost sysc
  • 虚拟机中配置外网环境

    文章目录 在虚拟机中配置外网环境 在虚拟机中配置外网环境 主机为 win10 xff0c 虚拟机中为 ubuntu 系统 xff0c 采用clash 1 xff0c 设置 Allow Lan xff0c 允许局域网访问 2 xff0c 虚拟
  • mysql 操作数据库(备份与恢复)

    一 直接把创建数据库的语句放到sql 文件中 xff1a php 写法 xff1a lt php mysql port 61 get mysql port cmd 61 US MYSQL BIN 34 mysql exe port 61 3
  • Go调用Python by go-python3

    确保python版本为3 7 conda create go python span class token assign left variable python span span class token operator 61 spa
  • linux下搭建maven私服

    maven私服我相信很多公司都有 xff0c 私服的好处有以下几点 xff1a 1 节省下载资源开销 jar包 xff08 不一定是jar xff0c 也可以是其他资源 xff09 都存在私服 xff0c 可以不必每次下载都去远程仓库去下载
  • git 安装包 最新 下载 快速 国内 镜像 地址

    下载git时 xff0c 先进官网看 https git scm com download win 然后发现几kb的网速 xff0c 这是要让我下一年么 xff0c 找了找网上有没有其他的镜像 xff0c 发现阿里有一个镜像 xff0c 下
  • docker笔记(四、docker部署beego打包后的二进制文件)

    在beego工程里 xff0c 使用go build可以将该工程打包成一个二进制文件 xff0c 那么这个二进制文件在docker里面该怎么部署呢 xff1f 先写一个简单的图片上传的demo xff0c 名字叫docker test 在工
  • LINUX服务器最简洁的HTTPS免费证书配置方法

    注意 xff1a 该方法已在多台服务器配置了免费的https证书 xff0c 无论是更新还是第一次配置都运行成功 xff1b 由于是免费版 xff0c 每个证书都只有三个月的有效期 xff0c 也无法保证安全和稳定性 xff0c 所以只建议
  • 【性能测试】获取性能系统指标之示例Python代码

    usr bin env python coding utf 8 import sys import datetime import time import psutil from ctypes import 34 34 34 性能测试示例P
  • select I/O 多路复用实现服务器聊天室功能

    基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取 xff0c 它就通知该进程 IO多路复用适用如下场合 xff1a xff08 1 xff09 当客户处理多个描述字时 xff08 一般是交互式输入和网络套接口 x
  • iOS-使用Masnory实现UITableViewCell自适应高度

    在iOS开发当中 xff0c 如果涉及到UITableViewCell的一些复杂UI的绘制时难免会碰到这么一个难题 xff1a UITableViewCell的高度如何设置 xff01 的确 xff0c 我们就拿一个简单的例子来说 xff1
  • ubuntu中共享文件夹看不到

    博主的ubuntu安装VMwaretools后共享文件夹设置完发现在 mnt hgfs总看不到 经过多次摸索后终于可以了 首先要使用root用户登陆ubuntu 然后再安装VMwaretools 在设置共享文件夹 然后解决挂在的问题 1 设
  • keystore was tampered with,or password was incorrect解决办法

    利用keytool导入证书 xff0c 命令如下 keytool import alias HZZSQKJdianshang file HZZSQKJdianshang cer keystore trust jks storepass st
  • Convert Picture or Video to ascii

    一个利用ascii拼成的谷歌街景地图 xff01 http tllabs io asciistreetview 看上去效果真不错 xff01 除此之外 xff0c linux下面也有类似的ascii艺术 xff0c 比如 aview asc