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

📄 spiht.h

📁 东南大学版本
💻 H
📖 第 1 页 / 共 2 页
字号:
				long  SnO=c[kc];
				kc++;
				if(kc>=len)break;
				if(SnO)
				{
					if(c[kc]==1)a[lis->i*2][lis->j*2]-=(1<<TN);
					else a[lis->i*2][lis->j*2]+=(1<<TN);
					kc++;
				}
				SnO=c[kc];
				kc++;
				if(kc>=len)break;
				if(SnO)
				{
					if(c[kc]==1)a[lis->i*2][1+lis->j*2]-=(1<<TN);
					else a[lis->i*2][1+lis->j*2]+=(1<<TN);
					kc++;
					if(kc>=len)break;
				}
				SnO=c[kc];
				kc++;
			    if(kc>=len)break;
				if(SnO)
				{
					if(c[kc]==1)a[1+lis->i*2][lis->j*2]-=(1<<TN);
					else a[1+lis->i*2][lis->j*2]+=(1<<TN);
					kc++;
				    if(kc>=len)break;
				}
				SnO=c[kc];
				kc++;
			    if(kc>=len)break;
				if(SnO)
				{
					if(c[kc]==1)a[1+lis->i*2][1+lis->j*2]-=(1<<TN);
					else a[1+lis->i*2][1+lis->j*2]+=(1<<TN);
					kc++;
					if(kc>=len)break;
				}
				////////////////////////////////
				if(IsLEmpty(a,lis->i,lis->j,height,width)==0)
				{
					long  SnL=c[kc];
					kc++;
					if(kc>=len)break;
					if(SnL)
					{
						lis_nail->next=new WLT_NODE;
						lis_nail->next->i=lis->i*2;
						lis_nail->next->j=lis->j*2;
						lis_nail->next->next=NULL;
						lis_nail=lis_nail->next;

						lis_nail->next=new WLT_NODE;
						lis_nail->next->i=lis->i*2;
						lis_nail->next->j=1+lis->j*2;
						lis_nail->next->next=NULL;
						lis_nail=lis_nail->next;

						lis_nail->next=new WLT_NODE;
						lis_nail->next->i=1+lis->i*2;
						lis_nail->next->j=lis->j*2;
						lis_nail->next->next=NULL;
						lis_nail=lis_nail->next;

						lis_nail->next=new WLT_NODE;
						lis_nail->next->i=1+lis->i*2;
						lis_nail->next->j=1+lis->j*2;
						lis_nail->next->next=NULL;
						lis_nail=lis_nail->next;
					}
				}
			}
			lis=lis->next;
		}
		while(lish)
		{
			WLT_NODE* p=lish;
			lish=lish->next;
			delete p;
		}
		TN--;
		if(kc>=len)break;
	}
	delete c;
}
void EZW_encoder(FW ** b1,long  height,long  width,long  scale,char* c0,long* len,long  TN)
{
	WLT_NODE *lis;
	WLT_NODE *lis_nail;
	WLT_NODE* lish;
	long * c=new long  [height*width*25];
	long kc=0;
	long  ht=(height>>scale);
	long  wh=(width>>scale);
	long ** a=new long * [height];
	long ** b=new long * [height];
	for(long  k=0;k<height;k++)
	{
		a[k]=new long  [width];
		b[k]=new long  [width];
	}
	for(k=0;k<height;k++)
	{
		for(long  j=0;j<width;j++)
		{
			b[k][j]=(long)b1[k][j];
		}
	}
	///////////////////////////////////////////////init
	while(TN>=0)
	{
		lis=new WLT_NODE;
		lis->next=NULL;
		lis_nail=lis;
		lish=lis;
		for(long  m=0;m<height;m++)
			for(long  n=0;n<width;n++)
			{
				if(b[m][n]>=0)a[m][n]=(abs(b[m][n])>>TN)&0x01;
				else a[m][n]=-((abs(b[m][n])>>TN)&0x01);
			}

	    for(int mh=0;mh<ht;mh++)
		{
			for(int nw=0;nw<wh;nw++)
			{
				long  ca=a[mh][nw];
				c[kc]=abs(ca);
				kc++;
				if(ca)
				{
					if(ca==-1)c[kc]=1;
					else c[kc]=0;
					kc++;
				}
			}
		}
		for(int l=0;l<3;l++)
		{
			for(int i=0;i<ht;i++)
				for(int j=0;j<wh;j++)
				{
					if(l==0)
					{
						WLT_NODE* nd=new WLT_NODE;
						nd->i=i;
						nd->j=wh+j;
						nd->next=NULL;
						lis_nail->next=nd;
						lis_nail=lis_nail->next;
					}
					else if(l==1)
					{
						WLT_NODE* nd=new WLT_NODE;
						nd->i=ht+i;
						nd->j=j;
						nd->next=NULL;
						lis_nail->next=nd;
						lis_nail=lis_nail->next;
					}
					else
					{
						WLT_NODE* nd=new WLT_NODE;
						nd->i=ht+i;
						nd->j=wh+j;
						nd->next=NULL;
						lis_nail->next=nd;
						lis_nail=lis_nail->next;
					}
				}
		}
		//////////////////////////////////1
		//////////////////////////////////2
		lis=lis->next;
		while(lis)
		{
			int ST=SnT(a,lis->i,lis->j,height,width);
			c[kc]=ST;
			kc++;
			if(ST)
			{
				////////////////////////////1
				int SO=SnO(a,lis->i,lis->j,height,width);
				c[kc]=SO;
				kc++;
				if(SO)
				{
					if(a[lis->i][lis->j]<0)c[kc]=1;
					else c[kc]=0;
					kc++;
				}
				////////////////////////////////
				if(IsTreeEmpty(a,lis->i*2,lis->j*2,height,width)==0)
				{
					lis_nail->next=new WLT_NODE;
					lis_nail->next->i=lis->i*2;
					lis_nail->next->j=lis->j*2;
					lis_nail->next->next=NULL;
					lis_nail=lis_nail->next;

					lis_nail->next=new WLT_NODE;
					lis_nail->next->i=lis->i*2;
					lis_nail->next->j=1+lis->j*2;
					lis_nail->next->next=NULL;
					lis_nail=lis_nail->next;

					lis_nail->next=new WLT_NODE;
					lis_nail->next->i=1+lis->i*2;
					lis_nail->next->j=lis->j*2;
					lis_nail->next->next=NULL;
					lis_nail=lis_nail->next;

					lis_nail->next=new WLT_NODE;
					lis_nail->next->i=1+lis->i*2;
					lis_nail->next->j=1+lis->j*2;
					lis_nail->next->next=NULL;
					lis_nail=lis_nail->next;
				}
			}
			lis=lis->next;
		}
		*len=kc;
		while(lish)
		{
			WLT_NODE* p=lish;
			lish=lish->next;
			delete p;
		}
		TN--;
	}
	for(k=0;k<height;k++)
	{
		delete a[k];
	}
	for(long lc=0;lc<kc;lc++)
	{
		long ki=lc>>3;
		long  kr=lc%8;
		if(kr==0)c0[ki]=0;
		c0[ki]=c0[ki]+(c[lc]<<kr);
	}
	delete a;
	delete c;
}
void EZW_decoder(FW** a,long  height,long  width,long  scale,char* c0,long len,long  TN)
{
	WLT_NODE *lis;
	WLT_NODE *lis_nail;
	WLT_NODE* lish;

	long * c=new long  [len];
	for(long lc=0;lc<len;lc++)
	{
		long ki=lc>>3;
		long  kr=lc%8;
		c[lc]=(c0[ki]>>kr)&1;
	}

	long kc=0;
	long  ht=(height>>scale);
	long  wh=(width>>scale);
	for(int m=0;m<height;m++)
		for(int n=0;n<width;n++)
		{
			a[m][n]=0;
		}
	///////////////////////////////////////////////init
	while(TN>=0)
	{
		lis=new WLT_NODE;
		lis->next=NULL;
		lis_nail=lis;
		lish=lis;

		for(int mh=0;mh<ht;mh++)
		{
			for(int nw=0;nw<wh;nw++)
			{
				long  ca=c[kc];
				kc++;
				if(kc>=len)break;
				if(ca)
				{
					if(c[kc])a[mh][nw]-=(1<<TN);
					else a[mh][nw]+=(1<<TN);
					kc++;
					if(kc>=len)break;
				}
			}
			if(kc>=len)break;
		}
		for(int l=0;l<3;l++)
		{
			for(int i=0;i<ht;i++)
				for(int j=0;j<wh;j++)
				{
					if(l==0)
					{
						WLT_NODE* nd=new WLT_NODE;
						nd->i=i;
						nd->j=wh+j;
						nd->next=NULL;
						lis_nail->next=nd;
						lis_nail=lis_nail->next;
					}
					else if(l==1)
					{
						WLT_NODE* nd=new WLT_NODE;
						nd->i=ht+i;
						nd->j=j;
						nd->next=NULL;
						lis_nail->next=nd;
						lis_nail=lis_nail->next;
					}
					else
					{
						WLT_NODE* nd=new WLT_NODE;
						nd->i=ht+i;
						nd->j=wh+j;
						nd->next=NULL;
						lis_nail->next=nd;
						lis_nail=lis_nail->next;
					}
				}
		}
		//////////////////////////////////1
		//////////////////////////////////2
		lis=lis->next;
		while(lis)
		{
			long  ST=c[kc];
			kc++;
			if(kc>=len)break;
			if(ST)
			{
				////////////////////////////1
				long  SnO=c[kc];
				kc++;
				if(kc>=len)break;
				if(SnO)
				{
					if(c[kc]==1)a[lis->i][lis->j]-=(1<<TN);
					else a[lis->i][lis->j]+=(1<<TN);
					kc++;
				}
				////////////////////////////////
				if(IsTreeEmpty(a,2*lis->i,2*lis->j,height,width)==0)
				{
					lis_nail->next=new WLT_NODE;
					lis_nail->next->i=lis->i*2;
					lis_nail->next->j=lis->j*2;
					lis_nail->next->next=NULL;
					lis_nail=lis_nail->next;

					lis_nail->next=new WLT_NODE;
					lis_nail->next->i=lis->i*2;
					lis_nail->next->j=1+lis->j*2;
					lis_nail->next->next=NULL;
					lis_nail=lis_nail->next;

					lis_nail->next=new WLT_NODE;
					lis_nail->next->i=1+lis->i*2;
					lis_nail->next->j=lis->j*2;
					lis_nail->next->next=NULL;
					lis_nail=lis_nail->next;

					lis_nail->next=new WLT_NODE;
					lis_nail->next->i=1+lis->i*2;
					lis_nail->next->j=1+lis->j*2;
					lis_nail->next->next=NULL;
					lis_nail=lis_nail->next;
				}
			}
			lis=lis->next;
		}
		while(lish)
		{
			WLT_NODE* p=lish;
			lish=lish->next;
			delete p;
		}
		TN--;
		if(kc>=len)break;
	}
	delete c;
}

⌨️ 快捷键说明

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