一、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/zh-hant/n/333634.html