数据压缩 | 实验五_JPEG原理分析及JPEG解码器的调试

该博客介绍了JPEG编解码原理,重点是JPEG文件格式的Segment组织形式和Marker,包括Segment的特点、0xFF处理规则。博主通过调试JPEG解码器程序,理解了程序设计框架、关键结构体以及TRACE在调试中的作用。此外,还展示了量化矩阵和HUFFMAN码表的输出,以及DC图像的概率分布统计。
摘要由CSDN通过智能技术生成

一、实验目的

掌握JPEG编解码系统的基本原理。初步掌握复杂的数据压缩算法实现,并能根据理论分析需要实现所对应数据的输出。

二、主要设备

安装Windows和Visual Studio软件的个人计算机

三、实验内容

1.JPEG编解码原理

在这里插入图片描述

JPEG编码的过程如上图所示。解码是编码的逆过程。

2.JPEG文件格式

2.1 Segment 的组织形式

JPEG 在文件中以 Segment 的形式组织,它具有以下特点:

  • 均以 0xFF 开始,后跟 1 byte 的 Marker 和 2 byte 的 Segment length(包含表示Length 本身所占用的 2 byte,不含“0xFF” + “Marker” 所占用的 2 byte);
  • 采用 Motorola 序(相对于 Intel 序),即保存时高位在前,低位在后;
  • Data 部分中,0xFF 后若为 0x00,则跳过此字节不予处理;
2.2 JPEG 的 Segment Marker

在这里插入图片描述
在这里插入图片描述

四、主要程序

  • main( )
int main(int argc, char *argv[])
{
   
  int output_format = TINYJPEG_FMT_YUV420P;
  char *output_filename, *input_filename;
  clock_t start_time, finish_time;
  unsigned int duration;
  int current_argument;
  int benchmark_mode = 0;
  const char* qtabFileName = "quantization_table.txt"; 
  const char* dcImgFileName = "dc.yuv";
  const char* acImgFileName = "ac.yuv"; 
  fopen_s(&qtabFilePtr, qtabFileName, "wb"); 
  fopen_s(&dcImgFilePtr, dcImgFileName, "wb");
  fopen_s(&acImgFilePtr, acImgFileName, "wb");  
#if TRACE
  p_trace=fopen(TRACEFILE,"w");
  if (p_trace==NULL)
  {
   
	  printf("trace file open error!");
  }
#endif
  if (argc < 3)
    usage();

  current_argument = 1;
  while (1)
   {
   
     if (strcmp(argv[current_argument], "--benchmark")==0)
       benchmark_mode = 1;
     else
       break;
     current_argument++;
   }

  if (argc < current_argument+2)
    usage();

  input_filename = argv[current_argument];
  if (strcmp(argv[current_argument+1],"yuv420p")==0)
    output_format = TINYJPEG_FMT_YUV420P;
  else if (strcmp(argv[current_argument+1],"rgb24")==0)
    output_format = TINYJPEG_FMT_RGB24;
  else if (strcmp(argv[current_argument+1],"bgr24")==0)
    output_format = TINYJPEG_FMT_BGR24;
  else if (strcmp(argv[current_argument+1],"grey")==0)
    output_format = TINYJPEG_FMT_GREY;
  else
    exitmessage("Bad format: need to be one of yuv420p, rgb24, bgr24, grey\n");
  output_filename = argv[current_argument+2];

  start_time = clock();

  if (benchmark_mode)
    load_multiple_times(input_filename, output_filename, output_format);
  else
    convert_one_image(input_filename, output_filename, output_format);

  finish_time = clock();
  duration = finish_time - start_time;
  snprintf(error_string, sizeof(error_string),"Decoding finished in %u ticks\n", duration);
#if TRACE
  fclose(p_trace);
#endif
  fclose(qtabFilePtr); 
  fclose
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值