
老二次元 / 科技宅倒背如流的Bad Apple 动画,网友 Nolen Royalty 用Vim 文本裁剪器复现出来了!
何况仅耗时8小时、用了6500个正则抒发式!
先来一说念瞅瞅恶果:
可以看到,动画基本复原了东说念主物的悉数四肢,全体视频也很通顺,画风很有经典像素风游戏的滋味。

继末端、游戏引擎、ASCII 码多样 Bad Apple 整活之后,Vim 裁剪器也前程了一趟!
难怪有网友说,这便是咱们心爱 Bad Apple 的原因,它老是能带给咱们更多惊喜。


PS:如果你还不知说念 Bad Apple,它是来自《东方 Project》中的一个音乐 MV,仍是成为动画界和科技界的一个梗。不仅有多样二创视频,全球还会在多样硬件和软件上复现它,可以说"有屏幕的场地就有 Bad Apple "。
怎么作念到的
网友 Nolen Royalty 还暖和共享了用 Vim 制作 Bad Apple 的经过,主要分为以下 4 步:

1. 提真金不怕火画面帧调度成数组
第一步额外概况,使用 GitHub 用户 Felixoofed 的库就可以赢得 Bad Apple 每一帧的数据。
这个仓库内部包含了原始的视频以及一个 ffmpeg 高歌,可以将视频调度为约 6500 张 PNG 图片,每张代表一帧。

然后 Nolen 编写了一小段 Python 代码,将每个 PNG 文献调度为 0 和 1 的二维数组(其中 1 代表玄色像素)。
视频伊始是 480x360 分辩率,在测量了末端后 Nolen 将其减弱到 120x90。
from PIL import Imageimport numpy as np
def process_image ( path, target_width=120, target_height=90 ) : img = Image.open ( path ) img = img.resize ( ( target_width, target_height ) , Image.Resampling.LANCZOS ) if img.mode != "L": img = img.convert ( "L" ) pixels = np.array ( img ) binary_pixels = ( pixels
def text_preview ( binary_pixels ) : chars = {0: ".", 1: "#"} return "n".join ( "".join ( chars [ px ] for px in row ) for row in binary_pixels )
2. 用 Vim 的高亮匹配功能绘制随便矩形
那么如安在 Vim 中绘制图形呢?
假定你在文本中创建了一个主要由 A 构成的网格,并在其中镶嵌一个由 B 构成的绘图,这么如果你搜索 B,就会看到一个小的棍状东说念主物图形:

使用这个次第就可以绘图了,关联词还存在 2 个问题:
a. 蓝色高亮(Vim 默许)看起来不太显著。
Vim 允许用户自行树立高亮功能,调用 hi Search cterm=NONE ctermfg=grey ctermbg=grey ,就可以让它用疏导的神采高亮匹配字符的远景和配景,这么就能得到漂亮的方块:

b. 第二个问题是,如何将矩形变为正方形像素。
Nolen 最终找到了Square 字体,这是一个正方形的字体,它伊始是为了让用户在末端中玩 roguelike 游戏而联想的,在 Vim 中使用它可以绘制一个额外漂亮的网格:

接下来便是分析每帧画面的信息,生成一个针对主要图形的正则抒发式优化文献。
然后作家发现,用 Vim 自带的搜索功能就可以生成连气儿的矩形。
/%l /%>l /#l Matches below a specific line ( higher line number ) .%.l Matches at the cursor line.%.l Matches below the cursor line.
Vim 搜索可以匹配特定的行号(和列号),你可以将多个这么的搜索组合在一说念。
举例, %>5c%4l%
何况,这种匹配容貌还可以和其他 Vim 搜索进行 OR 操作,比如将上头的式子和 - %>5c%4lcl%
这么,使用单个搜索式就可以放肆地在屏幕上绘制许多矩形。

3. 将动画帧的图形调度成矩形
接下来,就得把图像的网格(90x120,约 10000 个像素)拆成一个个矩形。
Nolen 伊始尝试找出悉数不同样的矩形并生成长搜索字符串、或者把网格拆成最少可填满的矩形,但两种尝试均以失败告终。
最终他思出了一个很概况的算法,它是这么使命的:先在图像的第一转里,把悉数连气儿的" 1 "的部分找出来。找完第一转,再看第二行,找出和第二行找到的部分有相通的场地。
淌若把这个相通部分和第一转合起来酿成的矩形的面积,比单独这两行酿成的矩形的面积都大的话,就把它们同一成一个矩形。然后就一直抓续下去,尽量把新找到的部分同一到之前的矩形里。
这个算法常常情况下施展得可以。但当搜索字符串跳跃 10000 个字符,就会严重拉低每秒的帧数。

Nolen 于是又写了两个处治有打算(从左到右构建矩形的算法版块和仅检讨各个行的概况 RLE),然后通过三种算法动手每个帧并选拔最短搜索容貌,这个组划算法最终恶果可以。
# Number of times each approach was pickedoriginal approach ( top to bottom merging ) - 1110left to right merging - 2239single-row RLE - 3300
4. 建设好 Vim 宏就可以在裁剪器中播放动画了
剖析好了图形,临了的一个问题便是:如安在 Vim 中播放视频。具体设施如下:
1.Vim 建设:顶部中心窗口播放视频,是一个包含 90 行每行 120 个空格的文献,驾驭两侧是用于图像居中的空缓冲区,底部窗口是约 6500 个搜索容貌列表。
2. 使用 Vim 宏播放视频:Vim 宏可以纪录一系列击键操作,浅薄重播。宏高歌为"" ay$:let @/=@a^M+ ",具体来说,便是对寄存器 a 操作,拉动到行尾,将寄存器 / 的推行建设为寄存器 a 的推行,实行高歌,然后转移到下一转着手。这么建设宏可以让光标归来到正确位置,反复迭代即可达成重播。
3. 优化:最意旨的优化操作是" let @/=@a ",比拟" /^Ra^M "操作,它幸免了过长的查询操作导致搜索窗口精明严重和帧率裁汰的问题。
4. 动手宏:可以动手" 1500@q "(假定宏纪录在寄存器 q 中)播放宏 1500 次,快速动手 1500 帧。

这么一来,就终于能得到着手的 Bad Apple 视频啦!
作家还示意,由于是在一天内完成的名目,还有好多可以完善的细节,比如可以创建结构细致的文献来使用传统正则抒发式而非 Vim 的行 / 列搜索功能,以及帧率的踏实性方面还可以陆续加强。
万物齐可 BadApple
除了用 Vim 裁剪器,网友们在 Bad Apple 整活上一直都脑洞翻开,可以说只好你思不到,莫得网友作念不到的。(doge)
比如有东说念主用马里奥游戏复现:

还有在电脑末端中敲几个高歌就能动手的:

以致包括一些奇奇怪怪的硬件,包括快被淘汰的旧式电视机、电磁泄露屏、以致作念实验用的示波器都可以:




看来,东说念主类对 Bad Apple 的设备可能还不到 10% 啊,期待以后能看到更多的整活视频(搓手手)
参考聚合:
[ 1 ] https://news.ycombinator.com/item?id=42674116
[ 2 ] https://eieio.games/blog/bad-apple-with-regex-in-vim/十大正规体育平台app