深入探究libpng

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ADQPK的頭像ADQPK
上一篇 2025-02-01 13:34
下一篇 2025-02-01 13:34

相關推薦

  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟體,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25
  • 深入剖析MapStruct未生成實現類問題

    一、MapStruct簡介 MapStruct是一個Java bean映射器,它通過註解和代碼生成來在Java bean之間轉換成本類代碼,實現類型安全,簡單而不失靈活。 作為一個…

    編程 2025-04-25
  • 深入理解Python字元串r

    一、r字元串的基本概念 r字元串(raw字元串)是指在Python中,以字母r為前綴的字元串。r字元串中的反斜杠(\)不會被轉義,而是被當作普通字元處理,這使得r字元串可以非常方便…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱「存儲程序控制原理」,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的匯流排來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25

發表回復

登錄後才能評論