利用jpeglib库进行图像压缩和解压缩

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值