从ImageMagick/GraphicsMagick中的文件中间读取图像



我有一个二进制文件,它以一些数据开头。在这些数据之后,文件中嵌入了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一起使用,请启发我!

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

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

将FILE*支持添加到Magick++中并不重要。我没有这么做的唯一原因是出于哲学原因(C++与C)。

最新更新