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

📄 coder.h

📁 东南大学版本
💻 H
📖 第 1 页 / 共 2 页
字号:
#include "WAVELET.h"
struct wn
{
	FW w;
	BYTE c;
};
struct EZWFile
{
	int height;
	int width;
	int height_s;
	int width_s;
	int scale;
	int TH;
	int rc_L;
	int gc_L;
	int bc_L;
};
int encoder(FW** pd,BYTE* c,int height,int width,int N1,int T,int TN)
{
	int k=0;
	int s=1;
	wn** p0=new wn* [height];
	for(int l=0;l<height;l++)
	{
		p0[l]=new wn [width];
	}
	for(int m=0;m<height;m++)
		for(int n=0;n<width;n++)
		{
			p0[m][n].w=pd[m][n];
			p0[m][n].c=5;
		}
	for(m=0;m<height;m++)
		for(int n=0;n<width;n++)
		{
			p0[m][n].w=pd[m][n];
			p0[m][n].c=5;
		}
	for(int x=0;x<=TN;x++)
	{
	for(s=N1;s>=1;s--)
	{
		for(int i=0;i<(height>>s);i++)
			for(int j=0;j<(width>>s);j++)
			{
				if(p0[i][(width>>s)+j].w>=T)
				{
					c[k]=1;
					p0[i][(width>>s)+j].c=1;
					p0[i][(width>>s)+j].w-=T;
					//p0[i][(width>>s)+j].w=0;
					k++;
				}
				else if(p0[i][(width>>s)+j].w<=-T)
				{
					c[k]=4;
					p0[i][(width>>s)+j].c=4;
					p0[i][(width>>s)+j].w+=T;
					//p0[i][(width>>s)+j].w=0;
					k++;
				}
				else
				{
					if(p0[i][(width>>s)+j].c!=2)
					{
						for(int l=s-1;l>=1;l--)
						{
							for(int g=0;g<(1<<(s-l));g++)
								for(int h=0;h<(1<<(s-l));h++)
								{
									if(abs(p0[(i<<(s-l))+g][(width>>l)+(j<<(s-l))+h].w)>=T)
									{
										c[k]=3;
									}
								}
						}
						if(c[k]!=3)
						{
							for(int l=s-1;l>=1;l--)
							{
								for(int g=0;g<(1<<(s-l));g++)
									for(int h=0;h<(1<<(s-l));h++)
									{
										p0[(i<<(s-l))+g][(width>>l)+(j<<(s-l))+h].c=2;
									}
							}
							c[k]=2;
						}
						k++;
					}
				}
			}
////////////////////////////////////1
		for(i=0;i<(height>>s);i++)
			for(int j=0;j<(width>>s);j++)
			{
				if(p0[(height>>s)+i][j].w>=T)
				{
					c[k]=1;
					p0[(height>>s)+i][j].c=1;
					p0[(height>>s)+i][j].w-=T;
				    //p0[(height>>s)+i][j].w=0;
					k++;
				}
				else if(p0[(height>>s)+i][j].w<=-T)
				{
					c[k]=4;
					p0[(height>>s)+i][j].c=4;
				    p0[(height>>s)+i][j].w+=T;
				    //p0[(height>>s)+i][j].w=0;
					k++;
				}
				else
				{
					if(p0[(height>>s)+i][j].c!=2)
					{
						for(int l=s-1;l>=1;l--)
						{
							for(int g=0;g<(1<<(s-l));g++)
								for(int h=0;h<(1<<(s-l));h++)
								{
									if(abs(p0[(height>>l)+(i<<(s-l))+g][(j<<(s-l))+h].w)>=T)
									{
										c[k]=3;
									}
								}
						}
						if(c[k]!=3)
						{
							for(int l=s-1;l>=1;l--)
							{
								for(int g=0;g<(1<<(s-l));g++)
									for(int h=0;h<(1<<(s-l));h++)
									{
										p0[(height>>l)+(i<<(s-l))+g][(j<<(s-l))+h].c=2;
									}
							}
							c[k]=2;
						}
						k++;
					}
				}
			}
//////////////////////////////////////////2
		for(i=0;i<(height>>s);i++)
			for(int j=0;j<(width>>s);j++)
			{
				if(p0[(height>>s)+i][(width>>s)+j].w>=T)
				{
					c[k]=1;
					p0[(height>>s)+i][(width>>s)+j].c=1;
					p0[(height>>s)+i][(width>>s)+j].w-=T;
					//p0[(height>>s)+i][(width>>s)+j].w=0;
					k++;
				}
				else if(p0[(height>>s)+i][(width>>s)+j].w<=-T)
				{
					c[k]=4;
					p0[(height>>s)+i][(width>>s)+j].c=4;
				    p0[(height>>s)+i][(width>>s)+j].w+=T;
					//p0[(height>>s)+i][(width>>s)+j].w=0;
					k++;
				}
				else
				{
					if(p0[(height>>s)+i][(width>>s)+j].c!=2)
					{
						for(int l=s-1;l>=1;l--)
						{
							for(int g=0;g<(1<<(s-l));g++)
								for(int h=0;h<(1<<(s-l));h++)
								{
									if(abs(p0[(height>>l)+(i<<(s-l))+g][(width>>l)+(j<<(s-l))+h].w)>=T)
									{
										c[k]=3;
									}
								}
						}
						if(c[k]!=3)
						{
							for(int l=s-1;l>=1;l--)
							{
								for(int g=0;g<(1<<(s-l));g++)
									for(int h=0;h<(1<<(s-l));h++)
									{
										p0[(height>>l)+(i<<(s-l))+g][(width>>l)+(j<<(s-l))+h].c=2;
									}
							}
							c[k]=2;
						}
						k++;
					}
				}
			}
	}
	for( m=0;m<height;m++)
		for(int n=0;n<width;n++)
	{
		p0[m][n].c=5;
	}
	T/=2;
	}
	///////////////////////
/*	for(m=0;m<height;m++)
		for(int n=0;n<width;n++)
		{
			pd[m][n]=p0[m][n].w;
		}
*/
	////////////////////////
	for(l=0;l<height;l++)
	{
		delete p0[l];
	}
	delete p0;
	return k;
}
void decoder(FW** pd,BYTE* c,int height,int width,int N1,int T,int TN)
{
	int k=0;
	int s=1;
	wn** p0=new wn* [height];
	for(int l=0;l<height;l++)
	{
		p0[l]=new wn [width];
	}
	for(int m=0;m<height;m++)
		for(int n=0;n<width;n++)
		{
			if(m<(height>>N1)&&n<(width>>N1))
			{
				p0[m][n].w=pd[m][n];
			}
			else
			{
				p0[m][n].w=0;
				pd[m][n]=0;
			}
			p0[m][n].c=5;
		}
	for(int x=0;x<=TN;x++)
	{
	for(s=N1;s>=1;s--)
	{
		for(int i=0;i<(height>>s);i++)
			for(int j=0;j<(width>>s);j++)
			{
				if(p0[i][(width>>s)+j].c!=2)
				{
					if(c[k]==1)
					{
						p0[i][(width>>s)+j].w=T;
						p0[i][(width>>s)+j].c=1;
						k++;
					}
					else if(c[k]==4)
					{
						p0[i][(width>>s)+j].w=-T;
						p0[i][(width>>s)+j].c=4;
						k++;
					}
					else if(c[k]==2)
					{
					    p0[i][(width>>s)+j].w=0;
						p0[i][(width>>s)+j].c=2;
					   for(int l=s-1;l>=1;l--)
						{
							for(int g=0;g<(1<<(s-l));g++)
								for(int h=0;h<(1<<(s-l));h++)
								{
									p0[(i<<(s-l))+g][(width>>l)+(j<<(s-l))+h].w=0;
									p0[(i<<(s-l))+g][(width>>l)+(j<<(s-l))+h].c=2;
								}
						}
					   k++;
					}
					else 
					{
					    p0[i][(width>>s)+j].w=0;
						p0[i][(width>>s)+j].c=3;
						k++;
					}
				}
			}
////////////////////////////////////1
		for(i=0;i<(height>>s);i++)
			for(int j=0;j<(width>>s);j++)
			{
				if(p0[(height>>s)+i][j].c!=2)
				{
					if(c[k]==1)
					{
						p0[(height>>s)+i][j].w=T;
						p0[(height>>s)+i][j].c=1;
						k++;
					}
					else if(c[k]==4)
					{
						p0[(height>>s)+i][j].w=-T;
						p0[(height>>s)+i][j].c=4;
						k++;
					}
					else if(c[k]==2)
					{
					    p0[(height>>s)+i][j].w=0;
						p0[(height>>s)+i][j].c=2;
					   for(int l=s-1;l>=1;l--)
						{
							for(int g=0;g<(1<<(s-l));g++)
								for(int h=0;h<(1<<(s-l));h++)
								{
									p0[(height>>l)+(i<<(s-l))+g][(j<<(s-l))+h].w=0;
									p0[(height>>l)+(i<<(s-l))+g][(j<<(s-l))+h].c=2;
								}
						}
					   k++;
					}
					else 
					{
					    p0[(height>>s)+i][j].w=0;
						p0[(height>>s)+i][j].c=3;
						k++;
					}
				}
			}
///////////////////////////////////////////////////////
		for(i=0;i<(height>>s);i++)
			for(int j=0;j<(width>>s);j++)
			{
				if(p0[(height>>s)+i][(width>>s)+j].c!=2)
				{
					if(c[k]==1)
					{
						p0[(height>>s)+i][(width>>s)+j].w=T;
						p0[(height>>s)+i][(width>>s)+j].c=1;
						k++;
					}
					else if(c[k]==4)
					{
						p0[(height>>s)+i][(width>>s)+j].w=-T;
						p0[(height>>s)+i][(width>>s)+j].c=4;
						k++;
					}
					else if(c[k]==2)
					{
					    p0[(height>>s)+i][(width>>s)+j].w=0;
						p0[(height>>s)+i][(width>>s)+j].c=2;
					   for(int l=s-1;l>=1;l--)
						{
							for(int g=0;g<(1<<(s-l));g++)
								for(int h=0;h<(1<<(s-l));h++)
								{
									p0[(height>>l)+(i<<(s-l))+g][(width>>l)+(j<<(s-l))+h].w=0;
									p0[(height>>l)+(i<<(s-l))+g][(width>>l)+(j<<(s-l))+h].c=2;
								}
						}
					   k++;
					}
					else 
					{
					    p0[(height>>s)+i][(width>>s)+j].w=0;
						p0[(height>>s)+i][(width>>s)+j].c=3;
						k++;
					}
				}
			}
		}
	for(m=0;m<height;m++)
		for(int n=0;n<width;n++)
		{
			if(!(m<(height>>N1)&&n<(width>>N1)))
			{
				pd[m][n]+=p0[m][n].w;
			}
		}
	for(int m=0;m<height;m++)
		for(int n=0;n<width;n++)
		{
			if(m<(height>>N1)&&n<(width>>N1))
			{
				p0[m][n].w=pd[m][n];
			}
			else
			{
				p0[m][n].w=0;
			}
			p0[m][n].c=5;
		}
	T/=2;
	}
	for(l=0;l<height;l++)
	{
		delete p0[l];
	}
	delete p0;
}
int encoderD(FW** pd,BYTE* c,BYTE*cs,int height,int width,int N1,int T,int TN)
{
	int k=0;
	int ks=0;
	int s=1;
	wn** p0=new wn* [height];
	for(int l=0;l<height;l++)
	{
		p0[l]=new wn [width];
	}
	for(int m=0;m<height;m++)
		for(int n=0;n<width;n++)
		{
			p0[m][n].w=pd[m][n];
			p0[m][n].c=5;
		}
	for(m=0;m<height;m++)
		for(int n=0;n<width;n++)
		{
			p0[m][n].w=pd[m][n];
			p0[m][n].c=5;
		}
	for(int x=0;x<=TN;x++)
	{
	for(s=N1;s>=1;s--)
	{
		for(int i=0;i<(height>>s);i++)
			for(int j=0;j<(width>>s);j++)
			{
				if(p0[i][(width>>s)+j].w>=T)
				{
					c[k]=1;
					p0[i][(width>>s)+j].c=1;

					////////////////////////////////////
					if(p0[i][(width>>s)+j].w>=1.5*T)
					{
						cs[ks]=1;
					}
					else
					{
						cs[ks]=0;
					}
					ks++;
                    ////////////////////////////////////

					p0[i][(width>>s)+j].w=0;
					k++;

				}
				else if(p0[i][(width>>s)+j].w<=-T)
				{
					c[k]=4;
					p0[i][(width>>s)+j].c=4;

					////////////////////////////////////
					if(p0[i][(width>>s)+j].w<=-1.5*T)
					{
						cs[ks]=1;
					}
					else
					{
						cs[ks]=0;
					}
					ks++;
                    ////////////////////////////////////

					p0[i][(width>>s)+j].w=0;
					k++;
				}
				else
				{
					if(p0[i][(width>>s)+j].c!=2)
					{
						for(int l=s-1;l>=1;l--)
						{
							for(int g=0;g<(1<<(s-l));g++)
								for(int h=0;h<(1<<(s-l));h++)
								{
									if(abs(p0[(i<<(s-l))+g][(width>>l)+(j<<(s-l))+h].w)>=T)
									{
										c[k]=3;
									}
								}
						}
						if(c[k]!=3)
						{
							for(int l=s-1;l>=1;l--)
							{
								for(int g=0;g<(1<<(s-l));g++)
									for(int h=0;h<(1<<(s-l));h++)
									{
										p0[(i<<(s-l))+g][(width>>l)+(j<<(s-l))+h].c=2;
									}
							}
							c[k]=2;
						}
						k++;
					}
				}
			}
////////////////////////////////////1
		for(i=0;i<(height>>s);i++)
			for(int j=0;j<(width>>s);j++)
			{
				if(p0[(height>>s)+i][j].w>=T)
				{
					c[k]=1;
					p0[(height>>s)+i][j].c=1;

					////////////////////////////////////
					if(p0[(height>>s)+i][j].w>=1.5*T)
					{
						cs[ks]=1;
					}
					else
					{
						cs[ks]=0;
					}
					ks++;
                    ////////////////////////////////////

				    p0[(height>>s)+i][j].w=0;
					k++;
				}
				else if(p0[(height>>s)+i][j].w<=-T)
				{
					c[k]=4;
					p0[(height>>s)+i][j].c=4;

					////////////////////////////////////
					if(p0[(height>>s)+i][j].w<=-1.5*T)
					{
						cs[ks]=1;
					}
					else
					{
						cs[ks]=0;
					}
					ks++;
                    ////////////////////////////////////

				    p0[(height>>s)+i][j].w=0;
					k++;
				}
				else
				{
					if(p0[(height>>s)+i][j].c!=2)
					{
						for(int l=s-1;l>=1;l--)
						{
							for(int g=0;g<(1<<(s-l));g++)
								for(int h=0;h<(1<<(s-l));h++)
								{
									if(abs(p0[(height>>l)+(i<<(s-l))+g][(j<<(s-l))+h].w)>=T)
									{
										c[k]=3;
									}
								}
						}
						if(c[k]!=3)
						{
							for(int l=s-1;l>=1;l--)
							{
								for(int g=0;g<(1<<(s-l));g++)
									for(int h=0;h<(1<<(s-l));h++)

⌨️ 快捷键说明

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