首页 > 解决方案 > 从二进制数据创建动画的快速方法

问题描述

我有一个 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 的网格数据(上下文是康威的生命游戏),因此欢迎利用这一点进行优化。但是请注意,目前每个 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()

标签: pythonc++image-processingbinaryfilesanimated-gif

解决方案


推荐阅读