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