png开始使用png


备注

Portable Network Graphics是一种光栅图形文件格式,支持无损数据压缩。 PNG是作为图形交换格式(GIF)的改进的非专利替代品而创建的,是互联网上使用最广泛的无损图像压缩格式。

PNG支持基于调色板的图像(24位RGB或32位RGBA颜色),灰度图像(带或不带alpha通道),以及带有可选Alpha通道的全彩色,非调色RGB [A]图像。 PNG设计用于在Internet上传输图像,而不是专业质量的打印图形,并且不支持CMYK等非RGB颜色空间。

PNG文件几乎总是使用文件扩展名PNG或png,并分配MIME媒体类型image / png。 PNG于1996年10月14日被互联网工程指导小组批准使用,并于2004年作为ISO / IEC标准发布。


对于专业或其他方面的图像编辑,PNG提供了一种有用的格式,用于存储编辑的中间阶段。 PNG压缩完全无损,支持最高48位真彩色或16位灰度。因此,与标准JPEG不同,即使在最高质量的JPEG设置下,保存,恢复和重新保存图像也不会降低其质量。与TIFF不同,PNG规范不允许实现者选择要支持的功能;保存在一个应用程序中的PNG图像在任何其他支持PNG的应用程序中都是可读的。

请注意,对于完成的真彩色图像的传输,特别是照相的,JPEG几乎总是更好的选择。 JPEG的有损压缩可能会引入可见的伪像,但这些可以最小化,即使在高质量水平下,文件大小的节省也比使用像PNG这样的无损格式更好。对于黑白图像,尤其是文本或绘图,TIFF的Group 4传真压缩或JBIG格式通常远优于1位灰度PNG。


PNG的压缩是最好的,可以在不丢失图像信息和不支付专利费的情况下使用。但并非所有实施都充分利用可用功率。甚至那些做的事情也会因用户的不明智选择而受阻。

版本

PNG

发布日期
1.0 1996-10-01
RFC-2083 1997年3月31日
1.1 1999-02-15
1.2 1999年7月14日
ISO / IEC 15948:2003 2003-11-10
ISO / IEC 15948:2004 2004-03-03

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, ...