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 的相关文章

  • 使用 ffmpeg 将视频与其自身连接,但相反

    我能够逆转 ffmpeg i input mp4 vf reverse output reversed mp4 我可以连接 ffmpeg i input mp4 i input mp4 filter complex 0 0 0 1 1 0
  • python中unicode字符串到ascii字符串的近似转换

    不知道这是否微不足道 但我需要将 unicode 字符串转换为 ascii 字符串 并且我不希望周围有所有这些转义字符 我的意思是 是否有可能 近似 转换为一些非常相似的 ascii 字符 例如 Gavin O Connor 转换为 Gav
  • 如何使用 AVFoundation 组合不同方向的视频剪辑

    我正在尝试使用 AVFoundation 将多个视频剪辑合并为一个 我可以使用下面的代码使用 AVMutableComposition 创建单个视频 AVMutableComposition composition AVMutableCom
  • 为什么我在模拟器中看不到视频?

    我见过几个与此类似的问题 但我想确定一下 我无法在模拟器上运行视频 是否一致 有人在模拟器上成功运行视频吗 以下是我使用的代码 import android app Activity import android net Uri impor
  • Phonegap html5视频无法播放

    我正在尝试在 iPad 上的phonegap 应用程序中播放视频 该视频给了我错误 MEDIA ERR SRC NOT SUPPORTED 我尝试播放的视频不是本地的 当我在该视频上使用curl I 时 这是它带来的信息 HTTP 1 1
  • 在列表视图/滚动视图中自动播放视频,类似于 facebook

    如果视图包含视频 我需要视频在列表视图 滚动视图中自动播放 这与 Facebook 非常相似 如果用户向下滚动并且可见区域包含视频 系统将播放视频 如果仍然滚动 则会自动停止该视频 它应该像一次播放一个视频一样工作 有人可以帮我解决这个问题
  • 仅使用 url 嵌入视频

    给定一个 youtube url 我如何使用 net c 将视频嵌入到页面中 只需添加如下一行 将 autoplay 设置为 0 或 1 取决于您是否希望人们真正留在您的页面上
  • 如何比较 ASCII 值

    我想将字母的 ASCII 值存储到变量中 我该怎么做 例如 r ASCII variable 82 main character character read from a file variable r ascii in this cas
  • Android 中如何获取帧

    实际上 我需要从视频中获取所有帧 但在使用 Mediametadataretriever 缩略图 时间戳获取帧时 我经常重复获取第一帧 然后获取特定时间帧 我通过更改所有 GetFrameAtTime options 尝试了很多修复 但仍然
  • 如何使用 jQuery 将 html5 视频播放器静音

    我找到了如何使用 jquery 暂停和播放视频 video get 0 play video get 0 pause 但我找不到静音按钮 如果没有 jquery 解决方案 我只需一个 onclick js 解决方案即可 我需要尽快 还有有办
  • Android - 如何合并两个视频

    基本上 我正在寻找一种将两个 mp4 视频文件 在 SD 卡上 组合在一起的方法 更像是在第一个视频的末尾附加第二个视频 我进行了很多搜索 但找不到合适的解决方案 好吧 我根本找不到任何解决方案 所以我的问题是 是否有一个库可以组合 并可能
  • 如何在 Jekyll 博客中包含视频标签/mp4 视频

    I am not寻找一种方法链接到 YouTube https stackoverflow com questions 10529859 how to include video in jekyll markdown blog 122738
  • Android 从 C++ 端播放原始音频

    我需要能够在 Android 系统的 C 端以自定义文件格式传输音频 我正在致力于移植自定义媒体播放器 并且需要能够打开自定义文件并从中传输音频 这很重要 因为我认为从性能角度来看将整个播放器移植到 JAVA 是不可行的 并且通过 JNI
  • Kivy 视频播放器无法在 Raspberry 3B+ 上运行

    我刚刚在我的电脑上安装了 Rasbian Stretch 和 KivyRPI3 我的应用程序工作正常 只是视频未播放 Rasbian kivy 和 gstreamer 都是最新的 我的应用程序和视频正在处理KivyPie 0 9b没有任何问
  • 如何在 cv2.VideoWriter 中使用 FPS 参数?

    好的 所以我正在制作视频 我想确切地知道如何使用 FPS 参数 它是一个浮点数 所以我假设这是我想要的每帧之间的间隔 你能给个例子吗 我只想知道视频会如何随着 FPS 参数值的变化而变化 因为我制作的视频现在太快了 谢谢 确实只是这样 fr
  • Python - Unicode 到 ASCII 的转换

    我无法在不丢失数据的情况下将以下 Unicode 转换为 ASCII u ABRA xc3O JOS xc9 I tried encode and decode他们不会这么做 有人有建议吗 Unicode 字符u xce0 and u xc
  • 如何从任何网站下载视频

    我只是想知道如何从任何网站下载视频的总体思路 我尝试的事情 我检查页面 在视频属性标记中看到 blob URL 将 blob URL 复制粘贴到浏览器中 但无法打开 I also look around the Developer tool
  • 如何在控制台中播放和暂停 Youtube 视频?

    转到一个 url 例如 https www youtube com embed zvCBSSwgtg4 https www youtube com embed zvCBSSwgtg4 并打开 chrome 控制台 我想知道什么 javasc
  • 在 Android 上提取/修改视频帧

    我有一个视频文件 我想获取视频的每一帧并对帧进行一些修改 例如在其中绘制另一个位图 放置一些文本等 Android 中是否有任何 API 框架可用于从视频中获取帧 我在 iOS 中使用他们的 AVFramework 做了类似的事情 如果可以
  • AVExportSession 在后台运行

    我正在开发一款需要合并多个视频的应用程序 我在用AVExportSession导出合并的视频 我还显示导出视频的进度条 大多数时候它都运行正确 当我们锁定屏幕或将应用程序置于后台模式时 就会出现此问题 这次 如果导出正在进行中 则将应用程序

随机推荐

  • 测试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