创建动图模拟CRT逐行显示

前些天看见有人慢镜头拍CRT显示器,才知道原来CRT某一时刻只显示一行,感觉好酷啊!于是就想着能不能写段程序模拟一下,看看任意图片在CRT逐行显示的效果下是什么样的(没钱买CRT显示器

程序主体就是这个循环:

frames = []
box = (0, 0, width, ROW)
for i in range(0, height, ROW):
    region = im.crop(box)
    blank = Image.new(im.mode, im.size)
    blank.paste(region, box)
    frames.append(blank)
    box = (0, box[3], width, box[3] + ROW if box[3] + ROW < height else height)

裁几行,存起来,裁几行,存起来:先用crop根据box的左、上、右、下四个参数裁剪图片,然后用paste粘贴到新创建的空白(黑色)图片上,再把新图片放到列表里以备保存成GIF。

因为CRT显示器可以以 kHz 为单位一行一行显示图像,而现在的显示器顶天以480Hz整张整张图像显示,要是每帧只显示一行像素没法模拟CRT的视觉残留,所以ROW其实是个十位数(即每帧显示几十行像素

最后结果真的闪瞎眼,所以我折叠了。调小ROWFPS可以缓解闪烁感,但就没慢放CRT内味了。

GIF链接在这里如果患有癫痫,或者身体不舒服的话就不要点了)

完整代码在这里


2019-12-21更新:

GIF就是个烂格式!本身帧与帧的间隔是以1%秒为单位设置的,但显示器144hz/60hz的刷新间隔都对不上1%秒,这就导致基本调不到想要的帧数(之前用imageio设置fps=60保存下来的GIFPillow读取发现duration20毫秒,就是约到1%秒的结果

另外这程序改几行可以把巨长图片转成分页的PDF:1536×44938的图片,想看一眼还得先缩放半天。直接转成一页的PDFEdge打开是乱的,火狐能正常打开,但特别糊。怀疑是到了单页分辨率极限了。分页后Edge就能正常打开了,而且和图片一样清楚。