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

时间:2012-11-19 08:01:29

标签: image imagemagick graphicsmagick magick++

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

目前,我所知道的使用Magick创建OpenGL纹理的唯一方法是使用Magick读取图像文件,将其写入blob,然后将blob.data()上传到opengl(来自此链接:{ {3}})。

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

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

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

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

  4. 我还查看了Magick的核心C API,我可以在其中指定文件句柄,但文档说文件句柄在读取图像后由Magick关闭,这对我的程序来说绝对不合适(它正在进行中)让我的程序的其余部分重新打开二进制文件以继续处理......非常难看......

    如果有办法为Magick提供自定义I / O例程,或者更好的是,使用Magick和OpenGL更简洁,请赐教!

1 个答案:

答案 0 :(得分:1)

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

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

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