int Compress::compress_rgb_to_jpeg(unsigned char *jpeg_buffer, void *buffer, int width, int height, unsigned long* size, int quality)
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
JSAMPROW row_pointer;
FILE * outfile;
static int written;
unsigned char* out_buffer = NULL;
unsigned long out_size;
cinfo.err = jpeg_std_error (&jerr);
jpeg_create_compress (&cinfo);
/*if ((outfile = fopen("C:\\dest.jpg", "wb")) == NULL)
{
return 0;
}
jpeg_stdio_dest (&cinfo, outfile); */
//dest_buffer(&cinfo, jpeg_buffer, size, &written);
jpeg_mem_dest(&cinfo, &out_buffer, size);
cinfo.image_width = width;
cinfo.image_height = height;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfo);
/* cinfo.num_components = 1;
cinfo.jpeg_color_space = JCS_GRAYSCALE;*/
cinfo.num_components = 3;
cinfo.jpeg_color_space = JCS_YCbCr;
cinfo.data_precision = 8;
jpeg_set_quality (&cinfo, quality, TRUE);
jpeg_start_compress (&cinfo, TRUE);
char* path = (char*)buffer;
char temp = 0;
/*for (int i=0; i < width*height*3; i+=3)
{
temp = *(path+i);
*(path+i) = *(path+i+2);
*(path+i+2) = temp;
}
*/
/*for (int i=0, j=0; j < width*height*3; i+=3, j+=4)
{
*(path+i)=*(path+j+2);
*(path+i+1)=*(path+j+1);
*(path+i+2)=*(path+j);
} */
while (cinfo.next_scanline < height)
{
row_pointer = (JSAMPROW)buffer + cinfo.next_scanline*width*3;
jpeg_write_scanlines (&cinfo, &row_pointer, 1);
}
jpeg_finish_compress (&cinfo);
if (jpeg_buffer != NULL)
{
for(int i = 0; i < *size; i++)
{
jpeg_buffer[i] = out_buffer[i];
}
}
jpeg_destroy_compress (&cinfo);
if(NULL != out_buffer)
{
free(out_buffer);
out_buffer = NULL;
}
return 1 ;
}
int Decompress::Decompress_jpeg_to_rgb(unsigned char *rgb_buffer, void *jpeg_buffer, int width, int height, unsigned long jpeg_size)
{
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE * infile;
JSAMPARRAY buffer;
int row_stride;
//绑定标准错误处理结构
cinfo.err = jpeg_std_error(&jerr);
//初始化JPEG对象
jpeg_create_decompress(&cinfo);
//指定图像文件
/*if ((infile = fopen("C:\\sample.jpg", "rb")) == NULL)
{
return;
}
jpeg_stdio_src(&cinfo, infile);*/
jpeg_mem_src( &cinfo, (unsigned char *)jpeg_buffer, jpeg_size );
//读取图像信息
(void) jpeg_read_header(&cinfo, TRUE);
//设定解压缩参数,此处我们将图像长宽缩小为原图的1/2
//cinfo.scale_num=1;
//cinfo.scale_denom=2;
cinfo.num_components = 3;
cinfo.jpeg_color_space = JCS_YCbCr;
cinfo.data_precision = 8;
/*cinfo.out_color_space = JCS_RGB;
cinfo.image_width = width;
cinfo.image_height = height;*/
//开始解压缩图像
(void) jpeg_start_decompress(&cinfo);
//分配缓冲区空间
row_stride = cinfo.output_width * cinfo.output_components;
//printf("cinfo.output_width = %d\n",cinfo.output_width);
//printf("cinfo.output_components = %d\n",cinfo.output_components);
buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
//读取数据
while (cinfo.output_scanline < cinfo.output_height)
{
(void) jpeg_read_scanlines(&cinfo, buffer, 1);
//output_scanline是从1开始,所以需要减1
int line=cinfo.output_scanline-1;
memcpy(rgb_buffer+line*row_stride,buffer[0],row_stride);
}
//结束解压缩操作
(void) jpeg_finish_decompress(&cinfo);
//释放资源
jpeg_destroy_decompress(&cinfo);
//fclose(infile);
return 0;
}
版权声明:本文为S664200185原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。