网上的例子都读入 jpeg图片,然后将jpeg转成rgb888,我给出的是传入 jpeg的buffer,解码成rgb888. 解码函数如下:
#include "jpeglib.h"
#include "jconfig.h"
#include "jmorecfg.h"
struct jerror_mgr
{
jpeg_error_mgr base;
jmp_buf jmp;
};
METHODDEF(void) jerror_exit(j_common_ptr jinfo)
{
jerror_mgr* err = (jerror_mgr*)jinfo->err;
longjmp(err->jmp, 1);
}
METHODDEF(void) joutput_message(j_common_ptr)
{
}
//函数参数:
//入参: img_data:jpeg buffer;
//入参:img_size: jpeg size;
//出参:pRgbBuff: 解码后的rgb888 buffer,内存由调用者分配,比如大于图像的width*height*3;
//出参:width: 图像的宽;
//出参:height: 图像的高;
bool JpegToRgb888(unsigned char* img_data, unsigned int img_size, unsigned char *pRgbBuff, uint32_t &width, uint32_t& height)
{
jpeg_decompress_struct jinfo;
jerror_mgr jerr;
jinfo.err = jpeg_std_error(&jerr.base);
jerr.base.error_exit = jerror_exit;
jerr.base.output_message = joutput_message;
jpeg_create_decompress(&jinfo);
if (setjmp(jerr.jmp))
goto bail;
jpeg_mem_src(&jinfo, img_data, img_size);
if (jpeg_read_header(&jinfo, TRUE) != JPEG_HEADER_OK)
goto bail;
jinfo.dct_method = JDCT_FLOAT; // change this to JDCT_ISLOW on Android/iOS
if (!jpeg_start_decompress(&jinfo))
goto bail;
if (jinfo.num_components != 1 && jinfo.num_components != 3)
goto bail;
{
JSAMPROW ptr = pRgbBuff;
while (jinfo.output_scanline < jinfo.output_height)
{
if (jpeg_read_scanlines(&jinfo, &ptr, 1) != 1) goto bail;
ptr += jinfo.output_width * jinfo.output_components;
}
}
if (!jpeg_finish_decompress(&jinfo))
goto bail;
width = jinfo.output_width;
height = jinfo.output_height;
jpeg_destroy_decompress(&jinfo);
return true;
bail:
jpeg_destroy_decompress(&jinfo);
return false;
}