利用libjpeg-turbo库压缩图像(RGB、YUV等)为jpg

尉迟景福
2023-12-01

简介

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数据进行压缩的。

 类似资料: