libpng 版本 1.6.21

Libpng 是作为 PNG 规范的伴侣编写的,旨在减少在应用程序中支持 PNG 文件格式所需的时间和精力。

Libpng 旨在同时处理多个会话,易于修改,可移植到绝大多数可用的机器(ANSI,K&R,16-,32-和 64 位),并且易于使用。最终目标是以任何可能的方式促进接受 PNG 格式。虽然仍有工作要做(参见 TODO 文件),但 libpng 应该可以满足大多数用户的需求。

用户限制:

PNG 规范允许图像的宽度和高度大到 2 ^ 31-1(0x7fffffff),或大约 21.47 亿行和列。对于安全性,libpng 强制默认限制为 100 万行和列。通过 png_error() 呼叫,将立即拒绝较大的图像。由于潜在的缓冲区溢出情况,Libpng 可能会拒绝非常宽的图像,但你可以使用以下命令设置自己的限制:

png_set_user_limits(png_ptr, width_max, height_max);

在创建 PNG 结构之后和调用 png_read_info()png_read_png()png_process_data() 之前放置此语句。

在编写 PNG 数据流时,请在调用 png_write_info()png_write_png() 之前输入此语句。

要检索正在应用的限制,请使用

width_max = png_get_user_width_max(png_ptr);
height_max = png_get_user_height_max(png_ptr);

PNG 规范对 PNG 数据流中允许的辅助块数量没有限制。默认情况下,libpng 会限制总共 1000 个 sPLT,tEXt,iTXt,zTXt 和要存储的未知块。如果设置了 info_ptrend_info_ptr,则限制分别适用于每个。更改要存储的此类块总数的限制:

png_set_chunk_cache_max(png_ptr, user_chunk_cache_max);

0x7fffffffL 意味着无限制。你可以使用以下方法检索此限制

chunk_cache_max = png_get_chunk_cache_max(png_ptr);

在解压缩时,Libpng 对 IDAT 以外的压缩块可占用的内存量施加了 8 兆字节(8,000,000 字节)的限制。你可以使用以下命令更改此限制

png_set_chunk_malloc_max(png_ptr, user_chunk_malloc_max);

你可以用以下方法检索限制:

chunk_malloc_max = png_get_chunk_malloc_max(png_ptr);

任何会导致超出这些限制的块都将被忽略。

检测 libpng 版本:

png_get_io_ptr() 函数自 libpng-0.88 起存在,从未改变,并且不受条件编译宏的影响。它是配置脚本中用于检测自 0.88 以来存在任何 libpng 版本的最佳选择。在 autoconf“configure.in”中你可以使用

AC_CHECK_LIB(png, png_get_io_ptr, ...