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