📄 spiht.h
字号:
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 + -