一、libpng是什么?
libpng是一种免费的、开源的、小型的、可移植的并且支持灵活配置的PNG图像文件处理库。它可以读写PNG文件并且提供了许多PNG文件的操作函数,比如读取和写入文件、内存的PNG图像的读写等。
libpng可以在多种操作系统中使用,包括Windows、Linux等。它是管理PNG文件的最常用的库之一。
二、libpng的基本操作
1、读取PNG文件:
png_structp png_ptr; png_infop info_ptr; png_bytep row_pointers[height]; png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, user_error_fn, user_warning_fn); info_ptr = png_create_info_struct(png_ptr); png_set_read_fn(png_ptr, (png_voidp)file, user_read_fn); png_read_info(png_ptr, info_ptr); for (int y = 0; y < height; y++) { row_pointers[y] = (png_byte*)malloc(png_get_rowbytes(png_ptr, info_ptr)); } png_read_image(png_ptr, row_pointers);
2、写入PNG文件:
png_structp png_ptr; png_infop info_ptr; png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, user_error_fn, user_warning_fn); info_ptr = png_create_info_struct(png_ptr); png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_set_write_fn(png_ptr, (png_voidp)file, user_write_fn, user_flush_fn); png_write_info(png_ptr, info_ptr); for (int y = 0; y < height; y++) { png_write_row(png_ptr, row_pointers[y]); } png_write_end(png_ptr, NULL);
3、释放内存:
png_infop info_ptr; png_structp png_ptr; ... png_destroy_write_struct(&png_ptr, &info_ptr);
三、PNG文件的色彩空间
PNG文件支持灰度图像、真彩色图像和索引彩色图像三种色彩空间。其中,灰度图像是最简单的一种,其它两种都是在灰度图像的基础上扩展的。
灰度图像:每一个像素点只能表示一种灰度值,比如黑白图片。
真彩色图像:RGB三个分量表示像素颜色值,其中红色、绿色、蓝色的分量位数可定制,比如RGB888,红色、绿色、蓝色分别占8比特位。
索引彩色图像:是使用一个专门的颜色映射表,其中每一个像素点只使用8个比特位来表示,比如使用索引值2表示的颜色是深绿色。
四、PNG文件的压缩
PNG文件的压缩方式是基于DEFLATE算法的,这是一种无损压缩方式。PNG文件不仅能够压缩颜色深度、颜色类型等信息,还可以压缩扫描线信息,有效地减小文件大小。
五、PNG文件的过滤
PNG文件在进行压缩以前,会先使用一个称为过滤器的操作,对扫描线数据进行预处理,以方便后面的压缩。这个过程可以进一步提高压缩比、减小文件大小。
过滤器的算法有五种:
1、None:即不做任何处理,直接将扫描线数据压缩。
2、Sub:将当前像素点的值减去左边相邻像素点的值,得到差值,再进行压缩。
3、Up:将当前像素点的值减去上方相邻像素点的值,得到差值,再进行压缩。
4、Average:将当前像素点的值减去左边和上方两个相邻像素点的值的平均值,得到差值,再进行压缩。
5、Paeth:使用Paeth预测函数来得到当前像素点的值与预测值的差值,再进行压缩。
六、总结
本文对PNG文件处理库libpng进行了详细的介绍,包括libpng的概述、基本操作、色彩空间、压缩以及过滤器等。在实际开发中,可以根据具体需求进行灵活配置,实现PNG文件的读写、内存操作等功能。
原创文章,作者:ADQPK,如若转载,请注明出处:https://www.506064.com/n/333634.html