python - 从二进制数据创建动画的快速方法
问题描述
我有一个 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()
解决方案
推荐阅读
- java - 不关闭 URLConnection
- spring-cloud - 具有 Zookeeper 依赖项的 Spring Cloud 在第二个访问者中获取 NullException
- html - 单击角度按钮后如何更改按钮的颜色
- php - 日期函数不适用于时间戳
- html - 如何在 flex 框中将容器宽度设置为子项,其中 flex-direction 为列,flex-wrap 为 wrap
- java - 从 java 代码或 Jmeter UI 创建 Jmeter 脚本的最佳实践是什么
- javascript - getDerivedStateFromError 和 componentDidCatch 有什么区别
- java - 如何将 .png 图像转换为字节数组 - Android、TFLITE 应用程序
- sql - 某些行的 MIN 和 MAX
- android - 如何将值从任何方法作为路径或 url 传递给 @POST 注释,例如 android 中的 @POST("/url") 到 @POST(getURL())