利用libjpeg-turbo庫壓縮影象(RGB、YUV等)為jpg
阿新 • • 發佈:2018-12-19
簡介
libjpeg-turbo是libjpeg的升級版,它 的價值是利用SIMD指令集,加速了編解碼過程。官網上的介紹中提到某個案例中從原來的0.3左右降低到0.1,時間只有原來的1/3,在我的工程中,時間減少到原來LibJpeg的一半左右。而它的使用與之前的LibJpeg完全相同,只是新增完善了部分功能,完全可以直接替換,使用很方便。
程式碼:(這是我封裝的一個函式,直接使用的turbo API實現,功能是從記憶體buffer中獲取原始rgb影象,經libjpeg-turbo壓縮輸出,然後寫入一個jpg資料流檔案,若要得到壓縮碼流做其它用處,可直接從輸出outjpg_buf中取即可):
#include "turbojpeg.h" int tj_CompressFromMem(void* fp_jpg,uchar* rgb_buffer,int quality) { tjhandle handle = NULL; int flags = 0; int pad = 4; //位元組對齊 int subsamp = TJSAMP_422; int pixelfmt = TJPF_RGB; /*建立一個turbojpeg控制代碼*/ handle=tjInitCompress(); if (NULL == handle){ return -1; } uchar *outjpg_buf=NULL; unsigned long outjpg_size; /*壓縮*/ //int ret = tjCompressFromYUV(handle,yuv_buffer,WIDTH,pad,HEIGHT,subsamp,&outjpg_buf,&outjpg_size,quality, flags); int ret = tjCompress2(handle, rgb_buffer,WIDTH,0,HEIGHT,pixelfmt,&outjpg_buf,&outjpg_size,subsamp,quality, flags); if (0 != ret) { tjDestroy(handle); return -1; } tjDestroy(handle); fwrite(outjpg_buf,1,outjpg_size,fp_jpg); return 0; }
libjpeg-turbo庫本提供直接壓縮yuv資料API(tjCompressFromYUV()),但使用後我輸出影象不正確,原因未去深究,考慮到專案本就需要rgb格式資料,故此處我是直接利用轉換後的rgb資料進行壓縮的。