IJG 库 jpeg转rg888的转换函数

网上的例子都读入 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;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值