2

我有一个以一些数据开头的二进制文件。在此数据之后,文件中嵌入了 JPEG 图像。在图像之后,文件继续包含一些其他数据。我希望将图像用作 OpenGL 纹理。

目前,我知道用 Magick 创建 OpenGL 纹理的唯一方法是用 Magick 读取图像文件,将其写入 blob,然后将 blob.data() 上传到 opengl(来自此链接:http:// www.imagemagick.org/pipermail/magick-developers/2005-July/002276.html)。

我正在尝试使用 Magick++,但它只允许我指定文件名,而不是 C 样式的文件句柄或文件流......我唯一的选择是以下吗?:

  1. 将二进制文件中的 JPEG 图像部分保存为单独的临时文件,并让 Magick++ 读取该图像。我不希望这样做,因为写入磁盘会减慢我的程序速度。

  2. 将图像部分读入一个数组,以该数组为数据创建一个Blob,然后读取该Blob得到一张图像。我也不希望这样做,因为在获得图像后,我需要再次将图像数据写入另一个 blob,整个代码变得不必要地长。

  3. 切换到另一个库,如 DevIL,它提供了我想要的支持。不幸的是,DevIL 不像 Magick 那样功能丰富。

我还研究了 Magick 的核心 C API,我可以在其中指定一个文件句柄,但文档说文件句柄在读取图像后被 Magick 关闭,这对我的程序肯定不好(它会很漂亮很难让我的程序的其余部分重新打开二进制文件以继续处理......

如果有一种方法可以为 Magick 提供自定义 I/O 例程,或者更好的是,一种更简洁的方式将 Magick 与 OpenGL 一起使用,请赐教!

4

1 回答 1

2

GraphicsMagick 的下一个版本在读取图像后不会关闭输入文件句柄。您可以尝试最新的开发快照。

您可以考虑使用 mmap()(内存映射文件)来访问数据并使用 Magick++ 将其视为内存中的 BLOB。这样做的主要问题是您可能不知道数据存在多长时间,以防您需要访问嵌入的 JPEG 图像数据之后的数据。

将 FILE* 支持添加到 Magick++ 是微不足道的。我没有这样做的唯一原因是出于哲学原因(C++ vs C)。

于 2013-01-22T02:50:48.350 回答