python - 如何高效地将图像从C进程传递到Python进程?

标签 python c image wxpython ipc

目标

将图像从 C 进程快速传递到 Python 进程。

详细信息

C 进程是一个生成光栅图像的命令行工具。 Python进程是一个GUI应用程序,它要求C工具生成图像,然后显示这些图像。因此,用户(在执行操作后)等待图像显示在 GUI 中。

速度要求

目前使用的系统是通过C应用程序将文件写入磁盘,然后通过Python应用程序读回。图像的大小可能以像素为单位有所不同(但约为 1000x1000)。当前格式是未压缩的,但是使用压缩格式传输也很慢。

通常,需要创建和显示多个图像,因此也可以应用一些并行方法。然而,并行化本身(以及压缩)并没有使传输速度更快。

平台和许可证

解决方案应该是跨平台的,尤其是 GNU/Linux、MS Windows 和 Mac OS X。

该项目遵循 GNU GPL 2 或更高版本,因此解决方案应该兼容。

该解决方案不应带来新的大型依赖项,例如 boost 库。较小的系统库或已使用的库更受欢迎。

C 应用程序正在使用 cairo 库。除非确实需要,否则最好不要添加新的依赖项。在极端情况下,可以使用 ctypes 将 C 代码包装到 Python 脚本中,但这不是首选。

Python 应用程序使用 wxPython、ctypes 和 PIL。可以添加新的依赖项,甚至可以包含新的库(但依赖项越少越好)。

最佳答案

那有多“慢”?如果您已经在使用库 - 例如 PIL 和 cairo - 他们确实有用于处理图像的优化代码。 您的解决方案可以通过在内存中传输文件进行一些优化,而不是写入磁盘,然后重新读取它们 - 而且,通过不使用原始图像 - LZ 风格的压缩可以提高未压缩图像的速度 - 我认为“默认情况下,“pcx”或“tiff”可以使用此类压缩。 (另一方面,PNG 压缩速度很慢)。

为了使用内存传输而不是通过磁盘,我认为您可以使用以下方法: 使用“cython”创建一个二进制模块,它将原始图像数据提供给 PIL 图像对象 - 并使用多处理调用 cython0 相关的函数,可能带有并发的向后移植。 future

Cython 是构建的必需条件,但不是运行此类模块的必需条件 - 我必须添加,因为依赖项是一个问题。

无论如何,我认为您应该在花费大量时间之前准确地分析您的系统 - 我认为您无法实现更好的速度(也许可以提高 200-300%,如果图像处理步骤很轻 - 但如果这会将你的时间从 3 秒减少到 1 秒,你就不会那么好 - 从你的问题我推断你想要一个数量级的提升)。如果您还没有并行运行图像处理 C 程序,那么当然应该为每个 CPU 核心生成至少一个这样的进程。

关于python - 如何高效地将图像从C进程传递到Python进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16056607/

相关文章:

python - jinja2 + 重构标记

python - 使用 python 生成器打印 set() 项目填充

python - torch.no_grad() 影响模型精度

c - 当在一个循环中启动大量内核时,OpenCL 程序会卡住

python - 仅使用一张深度图像的 OpenCV 视差图后过滤

html - 无法裁剪个人资料图片的特定部分

python - 如何解析 csv 文件中的字段以在 pandas 数据框中创建附加行?

c - 无法正确打印十进制到二进制数

c - TCP 连接错误 "No buffer space available"

从图库中选择的应用程序中的 iphone 存储图像