⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jcfunction.h

📁 bf533平台图像采集程序
💻 H
字号:

//#include "malloc.h"
#include "math.h"
//#include "memory.h"


 //********************************************************************
 // 方法名称:BuildVLITable 
 //
 // 方法说明:生成VLI表,使pVLITAB[i] = (i的二进制码的长度)
 //
 //********************************************************************
 void BuildVLITable(void)
 {
  int i;
  for (i = DC_MIN_QUANTED; i < DC_MAX_QUANTED; ++i)
  {
	  pVLITAB[i] = ComputeVLI(i);
  }
 } 

 #ifdef 0
 //********************************************************************
 // 方法名称:BuildSym2 
 //
 // 方法说明:将信号的振幅进行VLI编码,返回编码长度和信号振幅的编码
 //
 // 参数说明:
 // value:AC/DC信号的振幅
 //********************************************************************
 SYM2 BuildSym2(short value)
 {
  SYM2 Symbol;  
  Symbol.codeLen = ComputeVLI(value);
  Symbol.amplitude = 0;
  if (value >= 0)
  {
   Symbol.amplitude = value;
  }
  else
  {
//   Symbol.amplitude = (short)(pow(2,Symbol.codeLen)-1) + value;  
	Symbol.amplitude = (1 << Symbol.codeLen) - 1 + value; 
   //计算反码
   //eg. value=-5    -5长度为3,2^3-1+(-5)=2=010 =(101的反码)
  }

  return Symbol;
 }
 
 #endif //0
 //********************************************************************
 // 方法名称:RLEComp 
 //
 // 方法说明:使用RLE算法对AC编码
 //
 // 参数说明:
 // lpbuf:输入缓冲,8x8变换信号缓冲

 //********************************************************************
 /*
 void RLEComp(short* lpbuf, HUFFCODE* acHuffTab, int index)
 {  
  unsigned char zeroNum     = 0;                //0行程计数器
//  unsigned int EOBPos      = 0;                //EOB出现位置 
  unsigned int EOBPos      = index;                //EOB出现位置 
  const unsigned char MAXZEROLEN = 15;          //最大0行程
  unsigned int i        = 0;     
  unsigned int j        = 0;

  HUFFCODE * huff;
  SYM2 sym2;
 
//  EOBPos = DCTBLOCKSIZE - 1;           //设置起始位置,从最后一个信号开始
//  for (i = EOBPos; i > 0; i--)         //从最后的AC信号数0的个数
//  {
//   if (lpbuf[i] == 0)          
//   {
//    --EOBPos;           
//   }
//   else            
//   {
//    break;                   
//   }
//  }
	
  for (i = 1; i <= EOBPos; i++)         //从第二个信号,即AC信号开始编码
  {
   if (lpbuf[i] == 0 && zeroNum < MAXZEROLEN)  
   {
    ++zeroNum;   
   }
   else
   {  
   	 unsigned char zeroLen = zeroNum;                    //0的行程
	 unsigned char codeLen = ComputeVLI(lpbuf[i]);;                    //幅度编码占用长度
 	short amplitude = lpbuf[i];                 //幅度
 
//    lpOutBuf[j].zeroLen = zeroNum;       //0行程(连续长度)
//    lpOutBuf[j].codeLen = ComputeVLI(lpbuf[i]);    //幅度编码长度
//    lpOutBuf[j].amplitude = lpbuf[i];      //振幅      
    zeroNum = 0;           //0计数器复位
//    (*resultLen)++;           //符号数量++
    ++j;             //符号计数
    
	if (codeLen == 0)                   //是否有连续16个0
	{   
		huff = &acHuffTab[0xF0];
		WriteBitsStream(huff->code, huff->length);                   //写入块结束标记  
	}
	else
	{
		huff = &acHuffTab[zeroLen * 16 + codeLen];
		WriteBitsStream(huff->code, huff->length);                   //写入块结束标记  
		sym2 = BuildSym2(amplitude);
		WriteBitsStream(sym2.amplitude, sym2.codeLen);                //写进幅度  
	}   

   }
  } 
 }

*/
  // 生成标准Huffman表
 void BuildSTDHuffTab(unsigned char* nrcodes,unsigned char* stdTab,HUFFCODE* huffCode)
 {
  unsigned char i     = 0;             //临时变量
  unsigned char j     = 0;
  unsigned char k     = 0;
  unsigned short code   = 0; 

  for (i = 1; i <= 16; i++)
  { 
   for (j = 1; j <= nrcodes[i]; j++)
   {   
    huffCode[stdTab[k]].code = code & ( (1<<i) -1 );
    huffCode[stdTab[k]].length = i;
    ++k;
    ++code;
   }
   code*=2;
  } 

  for (i = 0; i < k; i++)
  {
   huffCode[i].val = stdTab[i];  
  };
 }


 //********************************************************************
 // 方法名称:SetQuantTable 
 //
 // 方法说明:根据所需质量设置量化表
 //
 // 参数说明:
 // std_QT:标准量化表
 // QT:输出量化表
 // Q:质量参数
 //********************************************************************
 void SetQuantTable(const unsigned char* std_QT,unsigned char* QT, int Q)
 {
  int tmpVal = 0;  
  unsigned long i    = 0; 

  if (Q < 1) Q = 1;          
  if (Q > 100) Q = 100;

  //非线性映射 1->5000, 10->500, 25->200, 50->100, 75->50, 100->0
  if (Q < 50)
  {
   Q = 5000 / Q;
  }
  else
  {
   Q = 200 - Q * 2;
  }

  for (i = 0; i < DCTBLOCKSIZE; ++i)
  {
   tmpVal = (std_QT[i] * Q + 50L) / 100L;

   if (tmpVal < 1) 
   {
    tmpVal = 1L;
   }
   if (tmpVal > 255)
   {
    tmpVal = 255L;
   }
//   QT[FZBT[i]] = (unsigned char)(tmpVal);
   QT[i] = (unsigned char)(tmpVal);
  } 
 }


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -