从二进制数据创建动画的快速方法

问题描述

我有一个C ++程序,该程序将2D网格的像素数据写入二进制文件。每个二进制文件可能具有多个背靠背的网格状态,并且这些二进制文件可能有多个。

例如我可以有10个二进制文件bin0,bin1,bin2 ... bin9,每个二进制文件保存10个网格状态的数据,总共有100个网格状态要进行动画处理。

我正在寻找一种从这些二进制文件中的网格状态创建动画的快速方法。

我的最佳尝试是使用python和PIL.Image创建gif:

import glob
import numpy as np
from PIL import Image
from functools import partial

def create_images():
    paths = glob.glob('./outfiles/dump*')
    imgs = []
    for path in sorted(paths,key=lambda x: int(x.split("p")[1])):
        with open(path,'rb') as ifile:
            for dat in iter(partial(ifile.read,rows*cols),b''):
                mem = memoryview(dat).cast('B',shape=[rows,cols])
                arr = np.asarray(mem)
                img = Image.fromarray(arr*255)
                imgs.append(img)
    return imgs

rows = 128
cols = 128
imgs = create_images()
imgs[0].save('./animation.gif',save_all=True,append_images=imgs[1:],loop=0)

但是,如果我有成千上万张图像,每张图像都有数千个像素,那么我实际写gif的最后一行可能会花费很长时间。当图像较大时,gif的呈现质量也很差。

期待有关如何使用与Pillow不同的库来使其快速运行的建议。如果有更好的选择使用C / C ++(或其他语言,但首选Python或C / C ++),则不必担心坚持使用Python,动画也不必是gif。

在我的情况下,我正在使用0或1的网格数据(上下文是Conway的“生命游戏”),因此欢迎利用此优势的优化。但是请注意,当前每个1或0占用二进制文件中的整个字节,因此未打包为位。

编辑

只需添加一个辅助python脚本来生成二进制文件即可,正如我上面为那些愿意的人所述。

import numpy as np

rows = 128
cols = 128

img_per_file = 10
num_files = 3

filesize = rows*cols*img_per_file

for i in range(num_files):
    filename = 'bin'+str(i)
    data = np.random.randint(2,size=filesize,dtype=np.uint8).tobytes()
    f = open(filename,'wb')
    f.write(data)
    f.close()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...