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

📄 ac_code.cpp

📁 这是用提升小波变换与嵌入零树编码实现的256色灰度BMP图像压缩与解压缩的程序。
💻 CPP
字号:
// AC_Code.cpp: implementation of the CAC_Code class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "decompress.h"
#include "AC_Code.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CAC_Code::CAC_Code()
{

}

CAC_Code::~CAC_Code()
{
	Code.RemoveAll();
	NewCode.RemoveAll();
	DecodeFuHao.RemoveAll();
}

CAC_Code::CAC_Code(CString FuHao)
{
	FuHaoZLS=FuHao.GetLength();
	YuanFuHao=FuHao;
	low=0;
	high=1;
	A=high-low;
	sum=FuHaoZLS;
	int i,k;
	for(i=0;i<FuHaoZLS;i++)
		FuHaoNum[i]=1;
	Code.SetSize(5,5);
	NewCode.SetSize(2,1);
	DecodeFuHao.SetSize(5,5);
	CodeId=0;
	NewCodeId=0;
}

void CAC_Code::Four_Encode(BYTE fuhao)  //四种符号PNZT的编码
{
    double num,lowtemp,leijinum=0; //fuhao这一符号的个数和累积个数
	int i,j,k,time=0;
	int ilow,ihigh;
	int ilast;
	int cishu=14;
	for(i=0;i<YuanFuHao.GetLength();i++)
	{
		if(fuhao==YuanFuHao.GetAt(i))
		{
			num=FuHaoNum[i];
			for(j=0;j<i;j++)
				leijinum+=FuHaoNum[j];
			lowtemp=low;
			A=high-low;
		    if(A<pow(10,-12))
			{
				ilow=(int)(low*10);
				Code.SetAtGrow(CodeId,ilow);
				CodeId++;
				while(cishu>0)
				{
					Code.SetAtGrow(CodeId,9);
				    CodeId++;
					cishu--;
				}
				lowtemp=low=0;
				high=1;
				A=1;
			}
			low=lowtemp+A*leijinum/sum;
			high=lowtemp+A*(leijinum+num)/sum;
			ilow=(int)(low*10);
			ihigh=(int)(high*10);
			if(ilow==ihigh)
			{
			    while(ilow==ihigh)
				{
				    Code.SetAtGrow(CodeId,ilow);
				    CodeId++;
				    low=low*10-ilow;
				    high=high*10-ihigh;
				    ilow=(int)(low*10);
				    ihigh=(int)(high*10);
					time++;
				}
				if(time>=8)
				{
					ilast=((float)ilow+(float)ihigh)/2+0.5;
					Code.SetAtGrow(CodeId,ilast);
					CodeId++;
					if(ilast==ihigh)
					{
				        high=high*10-ihigh;
				        ihigh=(int)(high*10);
						ilast=ihigh-1;
						Code.SetAtGrow(CodeId,ilast);
					    CodeId++;
					}
					low=0;
					high=1;
				}
			}
			FuHaoNum[i]++;
			sum++;
			break;
		}
	}
    
}

void CAC_Code::Four_EncodeLast(BYTE fuhao)//四种符号PNZT的编码的最后部分
{
	double num,lowtemp,leijinum=0; //fuhao这一符号的个数和累积个数
	int i,j,k,kk;
	int ilow,ihigh;
	int ilast;  //编码区间乘以10之后的整数部分
	for(i=0;i<YuanFuHao.GetLength();i++)
	{
		if(fuhao==YuanFuHao.GetAt(i))
		{
			num=FuHaoNum[i];
			for(j=0;j<i;j++)
				leijinum+=FuHaoNum[j];
			lowtemp=low;
			A=high-low;
			low=lowtemp+A*leijinum/sum;
			high=lowtemp+A*(leijinum+num)/sum;
			ilow=(int)(low*10);
			ihigh=(int)(high*10);
			if(ilow==ihigh)
			{
			    while(ilow==ihigh)
				{
				    Code.SetAtGrow(CodeId,ilow);
			    	CodeId++;
				    low=low*10-ilow;
			        high=high*10-ihigh;
			        ilow=(int)(low*10);
			        ihigh=(int)(high*10);
				}
			}
            ilast=((float)ilow+(float)ihigh)/2+0.5;
			Code.SetAtGrow(CodeId,ilast);
			CodeId++;
			FuHaoNum[i]++;
			sum++;
			A=high-low;
			break;
		}
	}
	CodeIntoNewCode();
}



void CAC_Code::CodeIntoNewCode()  //对前面得到的Code转化为二进制形的NewCode
{
	int jinwei=0;//前一位的计算结果得来的进位
	int i,j,l,k;
	BYTE TempCode=0;
	int tempgeshu=sum-FuHaoZLS;
	if(tempgeshu>255)
	{
		TempCode=tempgeshu>>8;
		NewCode.SetAtGrow(NewCodeId,TempCode);
		NewCodeId++;
		TempCode=tempgeshu;
		NewCode.SetAtGrow(NewCodeId,TempCode);
		NewCodeId++;
	}
	else
	{
		TempCode=0;
		NewCode.SetAtGrow(NewCodeId,TempCode);
		NewCodeId++;
		TempCode=tempgeshu;
		NewCode.SetAtGrow(NewCodeId,TempCode);
		NewCodeId++;
	}
	if(CodeId%2==0)
	{
	    for(i=0;i<CodeId;i++)
		{
		    TempCode=Code.GetAt(i);
			i++;
			TempCode=TempCode*10+Code.GetAt(i);
            NewCode.SetAtGrow(NewCodeId,TempCode);
			NewCodeId++;
			if(Code.GetAt(i)==10)
			{
				NewCode.SetAtGrow(NewCodeId,200);
				NewCodeId++;
			}
			TempCode=0;
		}
	}
	else
	{
		for(i=0;i<CodeId-1;i++)
		{
			TempCode=Code.GetAt(i);
			i++;
			TempCode=TempCode*10+Code.GetAt(i);
            NewCode.SetAtGrow(NewCodeId,TempCode);
			NewCodeId++;
			if(Code.GetAt(i)==10)
			{
				NewCode.SetAtGrow(NewCodeId,200);
				NewCodeId++;
			}
			TempCode=0;
		}
		TempCode=10*Code.GetAt(i);
		NewCode.SetAtGrow(NewCodeId,TempCode);
		NewCodeId++;
    }
	//Four_Decode();
}

void CAC_Code::Four_Decode(CArray <BYTE,BYTE> &Code)  //对前面编码得到的NewCode进行解码
{
	NewCode.Copy(Code);
	NewCodeId=Code.GetSize();
	low=0;
	high=1;
	A=1;
	int BeforeId=0;
	int GeShu=15;
	int k,time=0;
	char ilow,ihigh,iA; //编码区间乘以10之后的整数部分
	BYTE CodeTemp;
	BYTE code[18];
	BYTE code1,code2,code3,code4,code5,code6,code7,code8,code9,code10,code11,code12,code13,code14,code15,code16,code17,codefornext;
	long cd1,cd2,cd3,cd4,cd5,cd6,cd7,cd8;
	double FuHaoQuJian[5];
	double LeiJiNum=0;
	sum=FuHaoZLS;
	int i=0,j,m,n,s;
	int index,index1,index2;
	//int kk=0;
	int DecodeFuHaoId=0;  //解码符号表的下标
	int tag=0,flag=0;
	int geshu=GeShu;
	int ilast;
	double FloatCode=0;
	int FuHaoShu;
	FuHaoShu=NewCode.GetAt(0);
	if(FuHaoShu==0)
		FuHaoShu=NewCode.GetAt(1);
	else
	{
		FuHaoShu=(FuHaoShu<<8)+NewCode.GetAt(1);
	}
    A=high-low;  //区间范围
    for(j=0;j<FuHaoZLS;j++)
		FuHaoNum[j]=1;
	DecodeFuHaoId=0;
	for(j=0;j<FuHaoZLS+1;j++)
	{
		for(i=0;i<j;i++)
		{
			LeiJiNum+=FuHaoNum[i];
		}
		FuHaoQuJian[j]=low+A*LeiJiNum/sum;
		LeiJiNum=0;
	}
	i=2;
	for(index=1;index<=GeShu;index++)
	{
		if(flag==0)
		{
            CodeTemp=NewCode.GetAt(i);
			i++;
		    code[index]=CodeTemp/10;
		    FloatCode+=code[index]*pow(10,-index);
			flag=1;
			tag=1;
		}
		else
		{
	        code[index]=CodeTemp%10;
	        FloatCode+=code[index]*pow(10,-index);
			flag=0;
			tag=0;
		}
	}
	codefornext=CodeTemp%10;
	for(k=0;k<FuHaoZLS+1;k++)
	{
		if(DecodeFuHaoId<FuHaoShu)
		{
            while(FloatCode<=FuHaoQuJian[k] || k==FuHaoZLS)
			{
			    DecodeFuHao.SetAtGrow(DecodeFuHaoId,YuanFuHao.GetAt(k-1));
			    DecodeFuHaoId++;
				time=0;
                low=FuHaoQuJian[k-1];
			    high=FuHaoQuJian[k];
			    FuHaoNum[k-1]++;
			    sum++;
			    ilow=(int)(10*low);
			    ihigh=(int)(10*high);
			    if(ilow==ihigh)
				{	
			        while(ilow==ihigh)
					{
					    geshu--;
						low=low*10-ilow;
				        high=high*10-ihigh;
				        ilow=(int)(low*10);
				        ihigh=(int)(high*10); 
						time++;
					} 
					FloatCode=0;
					if(time>=8)
					{
						time++;
						geshu--;
						ilast=((float)ilow+(float)ihigh)/2+0.5;
					    if(ilast==ihigh)
						{
							time++;
							geshu--;
						}
						
					}
					for(index1=1,index2=1+time;index2<=geshu+time;index1++,index2++)
					{
						code[index1]=code[index2];
					}
				    if(tag==0)
					{
						flag=0;
                        while(i<NewCodeId && index1<=GeShu)
						{
							if(flag==0)
							{
								CodeTemp=NewCode.GetAt(i);
							    i++;
								if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i)==200)
								{
									code[index1]=(CodeTemp-10)/10;
									i++;
								}
								else
								{
							        code[index1]=CodeTemp/10;
								}
							    index1++;
								flag=1;
								tag=1;
							}
							else
							{
								if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
								{
									code[index1]=10;
								}
								else
								{
							        code[index1]=CodeTemp%10;
								}
							    index1++;
								flag=0;
								tag=0;
							}
							geshu++;
						}
						if(i==NewCodeId-1 && flag==0)
						{
							CodeTemp=NewCode.GetAt(i);
							i++;
							code[GeShu+1]=CodeTemp/10;
							code[GeShu+2]=CodeTemp%10;
							geshu=GeShu+2;
							tag=0;
						}
						else if(i==NewCodeId && flag==1)
						{
							if(CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
								code[GeShu+1]=10;
							else
							    code[GeShu+1]=CodeTemp%10;
							geshu=GeShu+1;
							tag=0;
						}
						if(tag==1)
						{
						if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
							codefornext=10;
						else
							codefornext=CodeTemp%10;
						}
					}	
					else 
					{
						flag=0;
						code[index1]=codefornext;
						index1++;
						geshu++;
						tag=0;
						while(i<=NewCodeId && index1<=GeShu)
						{
							if(flag==0 && i<NewCodeId)
							{
								CodeTemp=NewCode.GetAt(i);
							    i++;
								if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i)==200)
								{
									code[index1]=(CodeTemp-10)/10;
									i++;
								}
								else
								{
							        code[index1]=CodeTemp/10;
								}
							    index1++;
								flag=1;
								tag=1;
							}
							else
							{
								if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
								{
									code[index1]=10;
								}
								else
								{
							        code[index1]=CodeTemp%10;
								}
							    index1++;
								flag=0;
								tag=0;
							}
							geshu++;
						}
                        if(i==NewCodeId-1 && flag==0)
						{
							CodeTemp=NewCode.GetAt(i);
							i++;
							code[GeShu+1]=CodeTemp/10;
							code[GeShu+2]=CodeTemp%10;
							geshu=GeShu+2;
							tag=0;
						}
						else if(i==NewCodeId && flag==1)
						{
							if(CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
								code[GeShu+1]=10;
							else
							    code[GeShu+1]=CodeTemp%10;
							geshu=GeShu+1;
							tag=0;
						}
						if(tag==1)
						{
						    if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
							    codefornext=10;
						    else
							    codefornext=CodeTemp%10;
						}
					}
						
                    for(index=1;index<=geshu;index++)
					{
						FloatCode+=code[index]*pow(10,-index);
					}
				}//if(ilow==ihigh)
				if(time>=8)
				{
					low=0;
					high=1;
				}
				A=high-low;
				if(A<pow(10,-12))
				{
					for(index=1;index<=GeShu;index++)
						code[index]=0;
					for(index=GeShu+1;index<=geshu;index++)
						code[index-GeShu]=code[index];
					index=geshu-(GeShu-1);
					geshu=geshu-GeShu;
					if(tag==0)
					{
						flag=0;
						while(i<NewCodeId && index<=GeShu)
						{
							if(flag==0)
							{
							    CodeTemp=NewCode.GetAt(i);
							    i++;
								if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i)==200)
								{
									code[index]=(CodeTemp-10)/10;
									i++;
								}
								else
								{
									code[index]=CodeTemp/10;
								}
							    flag=1;
								tag=1;
								index++;
								geshu++;
							}
							else
							{
								if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
								{
									code[index]=10;
								}
								else
								{
							        code[index]=CodeTemp%10;
								}
								flag=0;
								tag=0;
								index++;
								geshu++;
							}
						}
						if(i==NewCodeId-1 && flag==0)
						{
							CodeTemp=NewCode.GetAt(i);
							i++;
							code[index]=CodeTemp/10;
							index++;
							code[index]=CodeTemp%10;
							index++;
							geshu=geshu+2;
							tag=0;
						}
						else if(i==NewCodeId && flag==1)
						{
							if(CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
								code[index]=10;
							else
							    code[index]=CodeTemp%10;
							index++;
							geshu++;
							tag=0;
						}
						if(tag==1)
						{
						    if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
							    codefornext=10;
						    else
							    codefornext=CodeTemp%10;
						}
					}
					else
					{
						code[index]=codefornext;
						index++;
						flag=0;
						geshu++;
                        while(i<NewCodeId && index<=GeShu)
						{
							if(flag==0)
							{
								CodeTemp=NewCode.GetAt(i);
							    i++;
								if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i)==200)
								{
									code[index]=(CodeTemp-10)/10;
									i++;
								}
								else
								{
									code[index]=CodeTemp/10;
								}
							    flag=1;
								tag=1;
								index++;
								geshu++;
							}
							else
							{
								if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
								{
									code[index]=10;
								}
								else
								{
							        code[index]=CodeTemp%10;
								}
								flag=0;
								tag=0;
								index++;
								geshu++;
							}
						}
						if(i==NewCodeId-1 && flag==0)
						{
							CodeTemp=NewCode.GetAt(i);
							i++;
							code[index]=CodeTemp/10;
							index++;
							code[index]=CodeTemp%10;
							index++;
							geshu=geshu+2;
							tag=0;
						}
						else if(i==NewCodeId && flag==1)
						{
							if(CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
								code[index]=10;
							else
							    code[index]=CodeTemp%10;
							index++;
							geshu++;
							tag=0;
						}
					    if(tag==1)
						{
						    if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
							    codefornext=10;
						    else
							    codefornext=CodeTemp%10;
						}
					}
					low=0;
					high=1;
					A=1;
					FloatCode=0;
					for(index=1;index<=geshu;index++)
					{
						FloatCode+=code[index]*pow(10,-index);
					}
				}
				for(m=0;m<FuHaoZLS+1;m++)
				{
	                for(n=0;n<m;n++)
					{
			            LeiJiNum+=FuHaoNum[n];
					}
		            FuHaoQuJian[m]=(long double)(low+A*LeiJiNum/sum);
		            LeiJiNum=0;
				}
			    k=-1;
			    break;
			} //while 
		}//if
		else
			break;
	}//for
}

⌨️ 快捷键说明

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