在libpng中重用pngPtr和infoPtr

时间:2013-04-22 22:36:21

标签: png libpng

我在我正在开发的项目中使用libpng。现在,帧被逐个读入内存,使用以下命令为readinfo结构分配内存:

pngPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
infoPtr = png_create_info_struct(pngPtr);

目前,在加载图像后,使用以下命令销毁上述指针

png_destroy_read_struct(&pngPtr, (png_infopp)0, (png_infopp)0);

但是,我希望能够在将png文件读取到内存的过程开始之前(仅一次)生成指针,并在读取所有PNG文件后销毁它们一次。换句话说,我希望能够创建一次指针,并重用它们。

我使用新方法得到的问题是,如果我在读取第一个PNG文件后没有销毁指针,则调用

png_read_info(pngPtr, infoPtr);
当libPng尝试加载第二个PNG文件时,

失败。指针的任何特定属性是否需要重置才能为后续的PNG文件重用?

为了简洁起见,我避免使用太多代码,但如果需要,我可以提供更多代码。

2 个答案:

答案 0 :(得分:0)

我认为重用结构不可能(或支持)。在公共文档中没有提及它,并在current sources内部偷看显示在新版本中已弃用/禁用的旧png_info_init。我想你可能会做一些黑客攻击(有或没有修改libpng源)来实现你的目标,但我不建议这样做 - 看起来比实际上更麻烦。如果你真的坚持,我会到libpng mailing list寻求更多帮助。

答案 1 :(得分:0)

当修补libpng以支持APNG文件时,它会重用结构。重置代码接近pngrutil.c的末尾。请注意,这可以直接访问png_struct的成员,这是自libpng-1.4.0以来应用程序不可见的。

但是,我不确定它是否值得。 png结构本身并不是很大。内存主要由像素数据(由row_pointers指向)消耗,该数据已经在您的控制之下,并且可以在您销毁之前重复使用内容。

在网络上搜索“apng patch”以找到一个。 http://sourceforge.net有两个,一个在“apng”项目中,另一个在“libpng-apng”项目中。