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;
}

 

發佈了82 篇原創文章 · 獲贊 21 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章