lib sppng ( simple png ) 是一個用於讀寫可移植網路圖形 (PNG) 格式檔案的 C 函式庫,重點在於安全性和易用性。
libspng 是 libpng 的替代品,專案是獨立的且 API 不相容。
目標是提供一個快速的 PNG 函式庫,其 API 比 libpng 更簡單,它在常見用例中的效能優於參考實作。
特徵 | 斯彭 | 庫檔案 | 機上盒圖像 | 洛德彭 |
---|---|---|---|---|
從串流中解碼 | ✅ | ✅ | ✅ | |
伽瑪校正 | ✅ | ✅ | ||
沒有已知的安全錯誤[1] | ✅ | ✅ | ✅ | |
漸進式影像讀取 | ✅ | ✅ | ||
解析所有標準塊 | ✅ | ✅ | ||
不需要 zlib [2] | ✅ | ✅ | ✅ | |
編碼 | ✅ | ✅ | ✅ | ✅ |
動畫 PNG | 計劃 | ✅ [3] |
[1]該專案在 OSS-Fuzz 上進行了模糊測試,漏洞在公開之前已修復。
[2]支援使用 miniz 進行建置。
[3]使用第 3 方補丁
下載最新版本並將spng.c/spng.h
包含在您的專案中,您也可以使用 CMake 或 Meson 進行構建,詳細資訊請參閱文件。
#include <spng.h>/* 建立解碼器上下文 */spng_ctx *ctx = spng_ctx_new(0);/* 設定輸入緩衝區 */spng_set_png_buffer(ctx, buf, buf_size);/* 確定輸出影像大小 */spng_decodeize_image_size (ctx, SPNG_FMT_RGBA8, &out_size);/* 解碼為8 位元RGBA */spng_decode_image(ctx, out, out_size, SPNG_FMT_RGBA8, 0);/* 釋放上下文記憶體*/spng_ctx_free(ctx); flag */spng_ctx *enc = spng_ctx_new(SPNG_CTX_ENCODER);/* 編碼到由函式庫管理的內部緩衝區*/spng_set_option(enc, SPNG_ENCODE_TO_BUFFER, 1);/* 指定圖片尺寸,PNG 格式* 3a_ihdrd .寬度=寬度, .高度=高度, .bit_深度 = 8, .color_type = SPNG_COLOR_TYPE_TRUECOLOR_ALPHA};/* 圖片將根據 ihdr.color_type, .bit_depth 進行編碼 */spng_set_ihdr(enc, &ihdr);/* SPNG_FMT_PNG 為標記*/spng_encode_image(enc, image, image_size, SPNG_FMT_PNG, SPNG_ENCODE_FINALIZE);/* 預設情況下PNG 寫入內部緩衝區*/void *png = spng_get_png_buffer(enizec, &png_size,Userc, &error);區*/free(png);/* 釋放上下文記憶體*/spng_ctx_free(enc);
請參閱範例.c。
代碼根據 BSD 2 條款「簡化」許可證獲得許可。
該專案包含來自 libpng 的最佳化和測試圖像,這些圖像已根據 PNG 參考庫許可證版本 2 獲得許可。
程式碼是根據 CERT C 編碼標準的規則編寫的。檢查所有整數算術是否有溢出,並妥善處理所有錯誤狀況。
該程式庫由 OSS-Fuzz 持續進行模糊測試,也使用 Clang Static Analyzer、Coverity Scan 和 PVS-Studio 掃描程式碼。
該測試套件由 1000 多個測試案例組成,使用所有可能的輸出格式和標誌組合對 175 個測試圖像進行解碼,並與 libpng 進行比較以確保正確性。
版本遵循語意版本控制方案並提供額外的保證:
0.4.0 到 0.8.x 的版本是穩定的
如果 1.0.0 將引入重大更改,那麼 0.8.x 將作為單獨的穩定分支進行維護
目前計劃相容1.0.0。
線上文件可從 libspng.org/docs 取得。
所有 PNG 顏色類型和位元深度組合均不支援解碼為SPNG_FMT_G8
、 SPNG_FMT_GA8
和SPNG_FMT_GA16
輸出格式,有關詳細信息,請參閱文件。
SPNG_FMT_PNG
、 SPNG_FMT_G8
、 SPNG_FMT_GA8
和SPNG_FMT_GA16
輸出格式未實現伽瑪校正。
您可以透過 OpenCollective 贊助開發,資金將根據路線圖用於維護和進一步開發。
與您的組織一起支持該專案。您的徽標將顯示在此處,並帶有指向您網站的連結。 [貢獻]