1. 程式人生 > >利用libjpeg-turbo庫壓縮影象(RGB、YUV等)為jpg

利用libjpeg-turbo庫壓縮影象(RGB、YUV等)為jpg

簡介

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資料進行壓縮的。