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_ptr
和 end_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, ...