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

📄 jpeg_ls.cpp

📁 图像无损压缩 TI常用例程 希望能对大家有所帮助
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			else if(Di[i]<T1) Qi[i]=1;
			else if(Di[i]<T2) Qi[i]=2;
			else if(Di[i]<T3) Qi[i]=3;
			else Qi[i]=4;
		}
//         ********************************************** 
//         *  完成从矢量(Q1,Q2,Q3)到Q的一一对应的映射  *
//         **********************************************		    
		    if((Qi[1]<0)||((Qi[1]==0)&&(Qi[2]<0))||(((Qi[1]==0)&&(Qi[2]==0))&&(Qi[3]<0)))
				     SIGN=-1;
			else     SIGN=1;
			if(SIGN==-1)
			{  
				for(i=1;i<4;i++)
			        Qi[i]=Qi[i]*SIGN;
			}
			Q=(Qi[1]*9+Qi[2])*9+Qi[3];
		    
//          ********************* 			 
//          *    计算Px的值     *
//          *********************
	/*	if(Rc>=__max(Ra,Rb)){
		Px=__min(Ra,Rb);
	c=1;
	if(Rc-__max(Ra,Rb)>=10)
				Px--;	}
	else{
		if(Rc<=__min(Ra,Rb)){
			Px=__max(Ra,Rb);
			c=1;
		 if(__min(Ra,Rb)-Rc>=10)
				Px++;}
		else{
			Px=Ra+Rb-Rc;
		c=0;}
	}
	if(c==0)
	Px=(Px+Ra+Rb)/3;*/
	/*if(Rc<=__max(Ra,Rb)){
				if(Rc<=__min(Ra,Rb)){
					if((10<=(Rd-Rb))&&(abs(Ra-Rb))<=10&&(__min(Ra,Rb)-Rc)>=5&&(Rd-Rb)<=50)
						Px=Rd/2+__max(Ra,Rb)/2;
					else 
						Px=__max(Ra,Rb);}
				else
					Px=Ra+Rb-Rc;}
			else{
				if(Rc-Ra>=10&&Rd<Rb&&Ra-Rb<=5)
					Px=Rd/2+__min(Ra,Rb)/2;
				else 
					Px=__min(Ra,Rb);
			}*/

	if(Rc>=__max(Ra,Rb))
		Px=__min(Ra,Rb);
	else{
		if(Rc<=__min(Ra,Rb))
			Px=__max(Ra,Rb);
		else
			Px=Ra+Rb-Rc;
	}
	if(SIGN==1)
		Px=Px+C[Q];
	else
		Px=Px-C[Q];
//       **********************************	
//       *  将Px规整到(0..MAXVAL)的范围  *
//       **********************************
	if(Px>MAXVAL)
		Px=MAXVAL;
	else if(Px<0)
		Px=0;
//      ******************************************************
//      *            从码流中恢复重建值Rx                    *
//      ******************************************************	
     k=LG(Q);

	if(decode!=0)/*之前为游程解码,当一个单元未处理就转入常规编码时,处理剩下的部分*/
	{
		while(((1<<(size-1))&decode)==0)/*读一元码*/
		{
		  size--;
          cnt++;
		}
		size--;
	  if(size==0)
		decode=0;
	  else
	    decode=(decode<<(32-size))>>(32-size);
	}
	else{ 
		while(decode==0)
		{
		 fread(&buffer,1,1,fp);
		 decode=buffer;
		 size=size+8;/*以8bit为单位处理*/
	     cnt=size;	   
		}
		   q=7;/*预设高几位形成的q=7(是处理单元能达到的最大值)*/
		   while(((1<<q)&decode)==0)
			   q--;
           cnt=cnt-8+7-q;/*0的个数*/ 		
           if(q==0)
			   decode=0;
		   else
		       decode=(decode<<(32-q))>>(32-q);/*处理后k位,之前置零*/
		   size=q;
	}

		   if(cnt<(LIMIT-qbpp-1))/*情况1*/
		   {
                  if(k<=size)
				  {
                   output=decode>>(size-k);/*得到后k位*/
				     if(size-k==0)
					   decode=0;
				     else
				       decode=((decode<<(32-size+k)))>>(32-size+k);/*此次处理结束,置零*/
                       size=size-k;		   
				  }

		         else
				 {
			      fread(&buffer,1,1,fp);
			      decode1=0;
			      if(k-size<=8)
				  decode1=decode<<(k-size);
			      while(k-size>8)
				  {
				   decode1=decode1+(decode<<(k-size))+(buffer<<(k-size-8));
                   k=k-8;
				   fread(&buffer,1,1,fp);
				   decode=0;
				  }
			   output=decode1+(buffer>>(8+size-k));/*第二项表示在k<size的单元里,得到当前的k位数*/
			   if(8-k+size==0)
				   decode=0;
			   else
			       decode=(buffer<<(32-8+k-size))>>(32-8+k-size);/*处理结束,置零*/
			   size=8-k+size;
				 }
		   MErrval=(cnt<<k)+output;
		   }
           else/*情况2*/
		   { 
			   if(qbpp<=size)
				  {
                  output=decode>>(size-qbpp);
		          if(size==qbpp)
					  decode=0;
				  else
				    decode=((decode<<(32-size+qbpp)))>>(32-size+qbpp);
			       size=size-qbpp;    
			   }

				else
				{
			   fread(&buffer,1,1,fp);
			    decode1=0;
	           	if(qbpp-size<=8)
					decode1=decode<<(qbpp-size);
			   while(qbpp-size>8)
			   {
				   decode1=decode1+(decode<<(qbpp-size))+(buffer<<(qbpp-size-8));
                   qbpp=qbpp-8;
				   fread(&buffer,1,1,fp);
				   decode=0;
			   }
			   output=decode1+(buffer>>(8+size-qbpp));
			   if(8-qbpp+size==0)
				   decode=0;
			   else
			       decode=(buffer<<(32-8+qbpp-size))>>(32-8+qbpp-size);
			   size=8-qbpp+size;
				}
		   MErrval=output+1;
        }             

		 if((NEAR==0)&&(k==0)&&(2*B[Q]<=-N[Q]))
{
	if((MErrval&1)==1)
		Errval=(MErrval-1)>>1;
	else
		Errval=(-(MErrval>>1))-1;
}
else
{
	if((MErrval&1)==0)
		Errval=((MErrval)>>1);
	else
		Errval=-((MErrval+1)>>1);
}
//      *********************************		
//      *        更新各个变量           *
//      *********************************	

B[Q]=B[Q]+Errval*(2*NEAR+1);
A[Q]=A[Q]+abs(Errval);
if(N[Q]==RESET)
{
	A[Q]=A[Q]>>1;
	B[Q]=B[Q]>>1;
	N[Q]=N[Q]>>1;
}
N[Q]=N[Q]+1;
Errval=Errval*(2*NEAR+1);
if(SIGN==-1)
  Errval=-Errval;
  Rx=Errval+Px;
if(Rx<(-NEAR))
   Rx=Rx+RANGE*(2*NEAR+1);
else if(Rx>(MAXVAL+NEAR))
   Rx=Rx-RANGE*(2*NEAR+1);
if(Rx<0)
Rx=0;
else if(Rx>MAXVAL)
Rx=MAXVAL;  
*(f+LinX*(y+2)+RowX)=Rx;

if(B[Q]<=-N[Q])
{
		B[Q]=B[Q]+N[Q];
		if(C[Q]>MIN_C)
			C[Q]=C[Q]-1;
		if(B[Q]<=-N[Q])
			B[Q]=-N[Q]+1;
}
		else if(B[Q]>0)
		{
			B[Q]=B[Q]-N[Q];
			if(C[Q]<MAX_C)
				C[Q]=C[Q]+1;
			if(B[Q]>0)
				B[Q]=0;
	
		}
}

long JPEG_LS::JPEG_LSEncoding(int *image, int height, int width)
{
	int i,j,Ra,Rb,Rc,Rd,Ix,D1,D2,D3;
    int BASIC_T1=3,BASIC_T2=7,BASIC_T3=21;
	float T1,T2,T3;
	struct timeb start_time,end_time;
	int second_d;
	int x,y;
	x=height;
	y=width;
	CT=0;

    Initial();
	
 	ftime(&start_time);

	f=new int[(x+1)*(y+2)]; /*补零后的图像多两列,一行*/

	
	 if((fp=fopen("E:\\out.ls","wb"))==NULL)
	{	  
	 	AfxMessageBox("Can not Open File!");
	}
       

//  计算各参数的值 
	for(i=1;i<=x;i++)
		for(j=1;j<=y;j++)
		{
			*(f+i*(y+2)+j)=image[(i-1)*y+j-1];/*前面空一行,以作重建值。从第二行写起。此时补的行还是零,到后面预测时补入Rb等。*/
            if(*(f+i*(y+2)+j)>MAXVAL)
				MAXVAL=*(f+i*(y+2)+j);/*先求实际最大值*/
		}

		
		for(i=0;(1<<i)<=MAXVAL;i++);
		MAXVAL=(1<<i)-1;/*规整到2的n次方故取大于实际MAXVAL的最小2的n次方*/
	    RANGE=((int)((MAXVAL+2*NEAR)/(2*NEAR+1)))+1;
        qbpp=-(int)(floor(-log(RANGE)/log(2.0)));
	    bpp=__max(2,-(int)(floor(-log(MAXVAL+1)/log(2.0))));
        LIMIT=2*(bpp+__max(8,bpp));	
	    if(MAXVAL>=128)
		{
		T1=CLAMP_1((float)((int)(__min(MAXVAL,4095)+128)/256)*(BASIC_T1-2)+2+3*NEAR);
        T2=CLAMP_2((float)((int)(__min(MAXVAL,4095)+128)/256)*(BASIC_T2-3)+3+5*NEAR,T1);
        T3=CLAMP_3((float)((int)(__min(MAXVAL,4095)+128)/256)*(BASIC_T3-4)+4+7*NEAR,T2);
		}
		else
		{
			T1=CLAMP_1((float)__max(2,BASIC_T1/(int)(256/(MAXVAL+1))+3*NEAR));
			T2=CLAMP_2((float)__max(3,BASIC_T2/(int)(256/(MAXVAL+1))+5*NEAR),T1);
            T3=CLAMP_3((float)__max(4,BASIC_T3/(int)(256/(MAXVAL+1))+7*NEAR),T2);
		}		
 
// 对各数组的初始化  
   for(j=0;j<365;j++)
	{
		A[j]=__max(2,(RANGE+(1<<5))/(1<<6));         
		N[j]=1;
		B[j]=0;
		C[j]=0;
	}
	A[365]=A[0];
	A[366]=A[0];
	N[365]=1;
	N[366]=1;
	
	/*第一行及第二行第一个全为零*/
	for(i=0;i<y+3;i++)
		*(f+i)=0;
 
   	while(RowX<=y&&LinX<=x)/*到计算时间之前为大循环,一个一个象素处理*/
	{   
       Ra=(*(f+LinX*(y+2)+RowX-1));
       Rb=(*(f+(LinX-1)*(y+2)+RowX));
       Rc=(*(f+(LinX-1)*(y+2)+RowX-1));
	   Rd=(*(f+(LinX-1)*(y+2)+RowX+1));
	   Ix=(*(f+LinX*(y+2)+RowX));
       D1=Rd-Rb;
       D2=Rb-Rc;
	   D3=Rc-Ra;

 // 选择编码方式       
	if((abs(D1)<=NEAR)&&(abs(D2)<=NEAR)&&(abs(D3)<=NEAR))
		RunModeProcessing(x,y,Ra,Rb,Rc,Rd,Ix);
    else
		RegularModeProcessing(y,Ra,Rb,Rc,Rd,Ix,D1,D2,D3,T1,T2,T3);
	    RowX++;
		if(RowX==y)/*原图像一行的结尾(是补零后的倒数第二个象素)*/
      	{
		*(f+(LinX+1)*(y+2))=*(f+LinX*(y+2)+1);/*处理下一行的第一个象素的上下文:将Rb赋给a*/
    	*(f+LinX*(y+2)+y+1)=*(f+LinX*(y+2)+y);/*处理当前行最后一个象素的上下文:将Rb赋给d*/
		 EOLine=1;
		}
	else
        EOLine=0;   
    	if(RowX>y)/*补零后的最后一个象素*/
		{
		RowX=RowX-y;/*也即rowx=1*/
		LinX++;
		}
	}

	if(cnt>0)
	code=code<<(8-cnt);

	
    fwrite(&code,1,1,fp);
	CT=CT+1;
	fclose(fp);
	ftime(&end_time);

// 计算编码时间   
	second_d=end_time.millitm-start_time.millitm;
	second_d=second_d+(end_time.time-start_time.time)*1000;
	return CT;
//	printf("The encoding costs:%.3f seconds.\n",(float)second_d/1000.0);

}

int* JPEG_LS::JPEG_LSDecoding(int width, int height)
{
	int x,y,i,j;
	int Ra,Rb,Rc,Rd,D1,D2,D3;
	int BASIC_T1=3,BASIC_T2=7,BASIC_T3=21;
	float T1,T2,T3;
 	int qbpp;
	struct timeb start_time,end_time;
	int second_d;
	int *pData;
	pData=new int[width*height];
	x=height;y=width;
    ftime(&start_time);

	Initial();

//计算各参数的值
	RANGE=((int)((MAXVAL+2*NEAR)/(2*NEAR+1)))+1;
    qbpp=-(int)(floor(-log(RANGE)/log(2.0)));
	bpp=__max(2,-(int)(floor(-log(MAXVAL+1)/log(2.0))));
    LIMIT=2*(bpp+__max(8,bpp));
    if(MAXVAL>=128)
	{
		T1=CLAMP_1((float)((int)(__min(MAXVAL,4095)+128)/256)*(BASIC_T1-2)+2+3*NEAR);
        T2=CLAMP_2((float)((int)(__min(MAXVAL,4095)+128)/256)*(BASIC_T2-3)+3+5*NEAR,T1);
        T3=CLAMP_3((float)((int)(__min(MAXVAL,4095)+128)/256)*(BASIC_T3-4)+4+7*NEAR,T2);}
	else
	{
		T1=CLAMP_1((float)__max(2,BASIC_T1/(int)(256/(MAXVAL+1))+3*NEAR));
		T2=CLAMP_2((float)__max(3,BASIC_T2/(int)(256/(MAXVAL+1))+5*NEAR),T1);
        T3=CLAMP_3((float)__max(4,BASIC_T3/(int)(256/(MAXVAL+1))+7*NEAR),T2);
	}

	f= new int[(x+1)*(y+2)];	  
		
	if((fp=fopen("E:\\out.ls","rb"))==NULL)
	{
		AfxMessageBox("Can not Open File!");
	}

// 对各数组的初始化    
	for(j=0;j<365;j++)
	{
		A[j]=__max(2,(RANGE+(1<<5))/(1<<6));         
		N[j]=1;
		B[j]=0;
		C[j]=0;
	}
	A[365]=A[0];
	A[366]=A[0];
	N[365]=1;
	N[366]=1;

// 读入变量 
 	for(i=0;i<(x+1)*(y+2);i++)
	*(f+i)=0;
	
   while(RowX<=y&&LinX<=x)
	{ 
	Ra=(*(f+LinX*(y+2)+RowX-1));
	Rb=(*(f+(LinX-1)*(y+2)+RowX));
    Rc=(*(f+(LinX-1)*(y+2)+RowX-1));
	Rd=(*(f+(LinX-1)*(y+2)+RowX+1));
	D1=Rd-Rb;
	D2=Rb-Rc;
	D3=Rc-Ra;
	

//  选择解码方式  
	if((abs(D1)<=NEAR)&&(abs(D2)<=NEAR)&&(abs(D3)<=NEAR))
		RunModeProcessing(qbpp,Ra,Rb,y);
    else
		DeModeProcessing(qbpp,Ra,Rb,Rc,Rd,D1,D2,D3,y,T1,T2,T3);
	if(RowX==y)
	{
	  *(f+LinX*(y+2)+y+1)=*(f+LinX*(y+2)+y);
      *(f+(LinX+1)*(y+2))=*(f+LinX*(y+2)+1);
	}
	      
	RowX++;
   	if(RowX>y)
	{
		RowX=RowX-y;
		LinX++;
	}
}
    fclose(fp);

//  文件输出格式选择 
    if((fp=fopen("E:\\de.raw","wb"))==NULL)
	{
	   AfxMessageBox("Can not Open File!");
	   
	}
	for(i=1;i<x+1;i++)
	   for(j=1;j<y+1;j++)
	   {
		   fwrite((f+i*(y+2)+j),1,1,fp);
		   pData[(i-1)*y+j-1]=*(f+i*(y+2)+j);
	   }
 	fclose(fp);

//  计算编码时间 
	ftime(&end_time);
	second_d=end_time.millitm-start_time.millitm;
	second_d=second_d+(end_time.time-start_time.time)*1000;

	return pData;
//	printf("The encoding costs:%.3f seconds.\n",(float)second_d/1000.0);
	


}

void JPEG_LS::Initial()
{
    Nn[0]=0;
	Nn[1]=0;
	RANGE=0;
	EOLine=0;
    size=0;
    LinX=1;RowX=1; 
    counter=0;
    flag1=0;
    cnt=0;code=0;pp=0;RUNindex=0;
    buffer=0;output=0;decode=0;decode2=0;
}

⌨️ 快捷键说明

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