libjpeg将Mat转换为jpeg数据

void rgb2jpeg(int width, int height, int channels, void* data, unsigned char ** outbuffer, unsigned long * outsize) {
	jpeg_compress_struct jpeg;
	jpeg_error_mgr jerr;
	jpeg.err = jpeg_std_error(&jerr);
	jpeg_create_compress(&jpeg);
	jpeg_mem_dest(&jpeg, outbuffer, outsize);
	jpeg.image_width = width;
	jpeg.image_height = height;
	jpeg.input_components = channels;
	jpeg.in_color_space = JCS_RGB;
	jpeg_set_defaults(&jpeg);
	jpeg_set_quality(&jpeg, 100, TRUE);
	jpeg_start_compress(&jpeg, TRUE);

	JSAMPROW row_pointer[1];
	int row_stride = width*channels;
	while (jpeg.next_scanline < jpeg.image_height)
	{
#if 1
		row_pointer[0] = &((unsigned char*)data)[jpeg.next_scanline * row_stride];
		(void)jpeg_write_scanlines(&jpeg, row_pointer, 1);
#else
		row_pointer[0] = &((unsigned char*)data)[(jpeg.image_height - jpeg.next_scanline - 1) * row_stride];
		(void)jpeg_write_scanlines(&jpeg, row_pointer, 1);
#endif
	}

	jpeg_finish_compress(&jpeg);
	jpeg_destroy_compress(&jpeg);
}

直接将opencv的Mat传入图片泛黄,查看了一下opencv中的写法,opencv中将bgr数据转为rgb数据,就正常了

unsigned char * outbuffer = NULL;
unsigned long outsize = 0;
cv::Mat dst;
cv::cvtColor(m, dst, CV_BGR2RGB);
rgb2jpeg(dst.cols, dst.rows, dst.channels(), dst.data, &outbuffer, &outsize);
if (outbuffer) {
		FILE* fp = fopen("1.jpg", "wb");
		fwrite(outbuffer, 1, outsize, fp);
		fclose(fp);
		free(outbuffer);
		outbuffer = NULL;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

telllong

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值