3

我在我正在处理的项目中使用 libpng。现在,帧被一一读取到内存中,使用以下命令将内存分配给readandinfo结构:

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 文件?

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

4

2 回答 2

0

我认为重用结构是不可能的(或支持的)。在公共文档中没有提及它,并且在当前来源中窥视显示一些旧png_info_init版本在新版本中已被弃用/禁用。我猜你可能会做一些黑客行为(修改或不修改 libpng 源)来实现你的目标,但我不建议这样做——这似乎比好处更麻烦。如果你真的坚持,我会去libpng 邮件列表寻求更多帮助。

于 2013-04-23T14:38:23.710 回答
0

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

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

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

于 2014-02-23T20:38:46.800 回答