目中集成icer_compression:API調(diào)用完整教程(含示例代碼))
如何在C項(xiàng)目中集成icer_compressionAPI調(diào)用完整教程含示例代碼【免費(fèi)下載鏈接】icer_compressionProgressive, error tolerant, wavelet-based image compression algorithm項(xiàng)目地址: https://gitcode.com/gh_mirrors/ic/icer_compressionicer_compression 是一個(gè)基于 NASA ICER 算法的 C 語(yǔ)言圖像壓縮庫(kù)采用漸進(jìn)式、小波變換wavelet壓縮方案專為內(nèi)存受限的嵌入式系統(tǒng)設(shè)計(jì)同時(shí)也能在普通桌面環(huán)境下高效運(yùn)行。本文將帶你從零開始完成 icer_compression 的 C 項(xiàng)目集成手把手演示壓縮與解壓的核心 API 調(diào)用方法并附上可直接運(yùn)行的示例代碼幫助你快速把這款容錯(cuò)能力強(qiáng)、可設(shè)定輸出大小的圖像壓縮算法用在自己的項(xiàng)目里。上圖展示了 icer_compression 的壓縮效果512×512 的原始灰度圖262KB在 70KB 字節(jié)配額下依然保持清晰的主體結(jié)構(gòu)這正是錯(cuò)誤隔離分段error containment segments與小波變換結(jié)合的威力。icer_compression 是什么NASA ICER 算法的 C 語(yǔ)言實(shí)現(xiàn)ICER 算法最早由 NASA 為深空通信場(chǎng)景設(shè)計(jì)主要解決數(shù)據(jù)在傳輸中可能丟失這一痛點(diǎn)。作為它的 C 語(yǔ)言實(shí)現(xiàn)icer_compression 繼承了以下核心特性?漸進(jìn)式壓縮可設(shè)置目標(biāo)字節(jié)配額達(dá)到配額即停止編碼?錯(cuò)誤容錯(cuò)將圖像劃分為多個(gè)錯(cuò)誤隔離段單段損壞不影響整圖?純整數(shù)運(yùn)算全程不使用浮點(diǎn)非常適合嵌入式 MCU?零動(dòng)態(tài)內(nèi)存分配庫(kù)內(nèi)部不 malloc內(nèi)存可完全由用戶掌控?支持 8 位與 16 位像素灰度與 YUV 彩色圖像均可處理相關(guān)源碼可以參考 lib_icer/inc/icer.h全部 API 聲明與 lib_icer/CMakeLists.txt庫(kù)的構(gòu)建配置。第一步克隆源碼并編譯 C 項(xiàng)目集成前需要先把項(xiàng)目拉取到本地并編譯出靜態(tài)庫(kù)。克隆命令如下git clone https://gitcode.com/gh_mirrors/ic/icer_compression cd icer_compression mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease .. make編譯完成后會(huì)生成libicer.a靜態(tài)庫(kù)以及compress、decompress、compress_color、decompress_color四個(gè)集成示例程序和命令行工具icer_util。你可以先用icer_util快速感受壓縮效果./icer_util compress input.jpg output.bin --grayscale ./icer_util decompress output.bin output.bmp --grayscale命令行工具的完整參數(shù)說(shuō)明見 example/src/icer_util.c。第二步集成前的必要配置編譯宏與初始化在 C 項(xiàng)目中引入 icer_compression只需要三步① 配置編譯宏在包含頭文件之前用#define聲明需要編譯的功能模塊#define USE_ENCODE_FUNCTIONS // 啟用壓縮函數(shù) #define USE_DECODE_FUNCTIONS // 啟用解壓函數(shù) #define USE_UINT16_FUNCTIONS // 使用 16 位像素接口 #define USE_UINT8_FUNCTIONS // 使用 8 位像素接口 #include icer.h② 鏈接庫(kù)編譯時(shí)加上-licer并把lib_icer/inc加入頭文件搜索路徑。③ 調(diào)用初始化函數(shù)程序啟動(dòng)后、首次壓縮前必須執(zhí)行一次int res icer_init(); if (res ! ICER_RESULT_OK) { printf(ICER 初始化失敗錯(cuò)誤碼%d\n, res); return -1; }icer_init()負(fù)責(zé)初始化熵編碼器、CRC32 查表等全局常量詳見 lib_icer/src/icer_init.c。第三步核心 API 調(diào)用——壓縮一張灰度圖像壓縮灰度圖像最簡(jiǎn)單的方式是調(diào)用icer_compress_image_uint16對(duì)應(yīng) 8 位版本為icer_compress_image_uint8。參考 example/src/example_encode.c 的實(shí)現(xiàn)核心流程如下uint16_t *image; // 圖像像素?cái)?shù)據(jù)灰度 size_t w 512, h 512; // 圖像寬高 uint8_t stages 4; // 小波分解級(jí)數(shù) enum icer_filter_types filt ICER_FILTER_A; // 濾波器類型 uint8_t segments 6; // 錯(cuò)誤隔離段數(shù)量 // 1. 準(zhǔn)備輸出緩沖區(qū)分配 2 倍配額 余量 uint8_t *datastream malloc(30000 * 2 500); icer_output_data_buf_typedef output; icer_init_output_struct(output, datastream, 30000 * 2, 30000); // 2. 執(zhí)行壓縮30000 字節(jié)為目標(biāo)配額 int res icer_compress_image_uint16(image, w, h, stages, filt, segments, output); if (res ! ICER_RESULT_OK res ! ICER_BYTE_QUOTA_EXCEEDED) { printf(壓縮失敗錯(cuò)誤碼%d\n, res); } // 3. 壓縮結(jié)果寫入文件 fwrite(output.rearrange_start, 1, output.size_used, fp);這里的關(guān)鍵是icer_init_output_struct的第三個(gè)參數(shù)字節(jié)配額它直接決定了壓縮的目標(biāo)大小配額越小壓縮率越高圖像質(zhì)量相應(yīng)下降。第四步彩色圖像壓縮——YUV 三通道 API 調(diào)用彩色圖像的 API 調(diào)用稍微復(fù)雜需要先把 RGB 轉(zhuǎn)為 YUV 三個(gè)通道再調(diào)用icer_compress_image_yuv_uint16。完整轉(zhuǎn)換代碼見 example/src/example_encode_color.c 中的rgb888_packed_to_yuv函數(shù)uint16_t *y_channel, *u_channel, *v_channel; // 三個(gè) YUV 通道緩沖 int res icer_compress_image_yuv_uint16( y_channel, u_channel, v_channel, // Y、U、V 通道 w, h, // 圖像寬高 stages, filt, segments, // 級(jí)數(shù)、濾波器、分段數(shù) output // 輸出緩沖 );彩色模式內(nèi)部會(huì)對(duì) Y 通道亮度和 U/V 通道色度分別建模編碼效率更高。下面這張圖展示了彩色模式在 140KB 配額下的壓縮效果第五步解壓 API 調(diào)用——還原圖像解壓是對(duì)稱操作調(diào)用icer_decompress_image_uint16即可。一個(gè)實(shí)用的技巧是先用icer_get_image_dimensions從壓縮流中讀出圖像尺寸再分配解壓緩沖參考 example/src/example_decode.c// 1. 從壓縮流中獲取圖像尺寸避免盲目分配 size_t img_w, img_h; icer_get_image_dimensions(datastream, data_length, img_w, img_h); // 2. 分配解壓緩沖并調(diào)用解壓 API uint16_t *image malloc(img_w * img_h * sizeof(uint16_t)); size_t out_w, out_h; int res icer_decompress_image_uint16( image, out_w, out_h, img_w * img_h, // 緩沖區(qū)容量 datastream, data_length, stages, filt, segments // 必須與壓縮時(shí)參數(shù)一致 ); if (res ! ICER_RESULT_OK) { printf(解壓失敗錯(cuò)誤碼%d\n, res); }??重要提醒解壓時(shí)傳入的stages、filt、segments必須與壓縮時(shí)完全一致否則無(wú)法正確還原圖像。參數(shù)調(diào)優(yōu)指南讓壓縮效果更理想?yún)?shù)取值范圍作用與建議stages小波級(jí)數(shù)1~6級(jí)數(shù)越多壓縮率越高但細(xì)節(jié)損失越大默認(rèn) 4 是平衡點(diǎn)filt濾波器A~F、QA 為通用默認(rèn)值不同濾波器對(duì)不同圖像內(nèi)容敏感segments分段數(shù)1~32分段越多容錯(cuò)越強(qiáng)但壓縮率略微下降字節(jié)配額0直接控制輸出大小配額越大質(zhì)量越好這些宏的上限可在 lib_icer/inc/icer.h 中通過(guò)ICER_MAX_SEGMENTS、ICER_MAX_DECOMP_STAGES等預(yù)定義調(diào)整方便按嵌入式平臺(tái)的內(nèi)存大小裁剪。常見錯(cuò)誤碼速查表API 返回值為負(fù)時(shí)表示出錯(cuò)最常見的有ICER_BYTE_QUOTA_EXCEEDED (-5)已達(dá)到字節(jié)配額屬正常截?cái)鄩嚎s成功ICER_OUTPUT_BUF_TOO_SMALL (-2)輸出緩沖區(qū)不足需增大分配ICER_DECODED_INVALID_DATA (-8)解壓數(shù)據(jù)校驗(yàn)失敗參數(shù)可能不匹配ICER_INVALID_INPUT (-11)輸入?yún)?shù)非法如寬高為 0完整錯(cuò)誤碼定義見 lib_icer/inc/icer.h 中的enum icer_status??偨Y(jié)本文從克隆源碼、CMake 編譯到icer_init()初始化、灰度/彩色壓縮 API 調(diào)用、解壓還原完整演示了 icer_compression 在 C 項(xiàng)目中的集成全流程。作為一款源自 NASA 的漸進(jìn)式小波圖像壓縮算法它最大的價(jià)值在于錯(cuò)誤容錯(cuò) 目標(biāo)字節(jié)配額這兩大能力非常適合衛(wèi)星通信、遙感圖像、嵌入式設(shè)備等對(duì)數(shù)據(jù)可靠性和內(nèi)存占用敏感的場(chǎng)景。動(dòng)手跑一遍示例代碼example/src/你就能直觀感受到它的壓縮效率與集成的便捷性。【免費(fèi)下載鏈接】icer_compressionProgressive, error tolerant, wavelet-based image compression algorithm項(xiàng)目地址: https://gitcode.com/gh_mirrors/ic/icer_compression創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考