📄 spiht.h
字号:
#define NULL 0
#define M 1024
#include "stdlib.h"
#include "iostream.h"
struct WLT_NODE
{
long i;
long j;
WLT_NODE* next;
};
struct SPIHTFile
{
int height;
int width;
int height_s;
int width_s;
int scale;
int TN;
int rc_L;
int gc_L;
int bc_L;
};
int SnD(long ** a,int i,int j,long height,long width)
{
int s=0;
int l=1;
while(((i<<l)<height)&&((j<<l)<width))
{
for(int k=(i<<l);k<(i<<l)+(1<<l);k++)
{
for(int m=(j<<l);m<(j<<l)+(1<<l);m++)
{
if(a[k][m]){s=1;break;}
}
if(s)break;
}
if(s)break;
l++;
}
return s;
}
int SnT(long ** a,int i,int j,long height,long width)
{
int s=0;
int l=0;
while(((i<<l)<height)&&((j<<l)<width))
{
for(int k=(i<<l);k<(i<<l)+(1<<l);k++)
{
for(int m=(j<<l);m<(j<<l)+(1<<l);m++)
{
if(a[k][m]){s=1;break;}
}
if(s)break;
}
if(s)break;
l++;
}
return s;
}
int SnL(long ** a,int i,int j,long height,long width)
{
int s=0;
int l=2;
while(((i<<l)<height)&&((j<<l)<width))
{
for(int k=(i<<l);k<(i<<l)+(1<<l);k++)
{
for(int m=(j<<l);m<(j<<l)+(1<<l);m++)
{
if(a[k][m]){s=1;break;}
}
if(s)break;
}
if(s)break;
l++;
}
return s;
}
int SnO(long ** a,int i,int j,long height,long width)
{
if(a[i][j])return 1;
else return 0;
}
int IsLEmpty(long ** a,int i,int j,long height,long width)
{
return ((i<<2)>=height)||((j<<2)>=width);
}
int IsLEmpty(double ** a,int i,int j,long height,long width)
{
return ((i<<2)>=height)||((j<<2)>=width);
}
int IsTreeEmpty(long ** a,int i,int j,long height,long width)
{
return ((i>=height)||(j>=width));
}
int IsTreeEmpty(double ** a,int i,int j,long height,long width)
{
return ((i>=height)||(j>=width));
}
void SPIHT_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;
char* c=new char [height*width*20];
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);
//if(a[m][n])b[m][n]=0;
}
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
for(int i=0;i<2*ht;i++)
{
for(int j=0;j<2*wh;j++)
{
long ca=a[i][j];
c[kc]=abs(ca);
kc++;
if(ca)
{
if(ca==-1)c[kc]=1;
else c[kc]=0;
kc++;
}
}
}
//////////////////////////////////2
lis=lis->next;
while(lis)
{
int SD=SnD(a,lis->i,lis->j,height,width);
c[kc]=SD;
kc++;
if(SD)
{
////////////////////////////1
int SO=SnO(a,lis->i*2,lis->j*2,height,width);
c[kc]=SO;
kc++;
if(SO)
{
if(a[lis->i*2][lis->j*2]<0)c[kc]=1;
else c[kc]=0;
kc++;
}
SO=SnO(a,lis->i*2,1+lis->j*2,height,width);
c[kc]=SO;
kc++;
if(SO)
{
if(a[lis->i*2][1+lis->j*2]<0)c[kc]=1;
else c[kc]=0;
kc++;
}
SO=SnO(a,1+lis->i*2,lis->j*2,height,width);
c[kc]=SO;
kc++;
if(SO)
{
if(a[1+lis->i*2][lis->j*2]<0)c[kc]=1;
else c[kc]=0;
kc++;
}
SO=SnO(a,1+lis->i*2,1+lis->j*2,height,width);
c[kc]=SO;
kc++;
if(SO)
{
if(a[1+lis->i*2][1+lis->j*2]<0)c[kc]=1;
else c[kc]=0;
kc++;
}
////////////////////////////////
if(IsLEmpty(a,lis->i,lis->j,height,width)==0)
{
int SL=SnL(a,lis->i,lis->j,height,width);
c[kc]=SL;
kc++;
if(SL)
{
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];
delete b[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 b;
delete c;
}
void SPIHT_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 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
for(int i=0;i<2*ht;i++)
{
for(int j=0;j<2*wh;j++)
{
long ca=c[kc];
kc++;
if(kc>=len)break;
if(ca)
{
if(c[kc])a[i][j]-=(1<<TN);
else a[i][j]+=(1<<TN);
kc++;
if(kc>=len)break;
}
}
if(kc>=len)break;
}
//////////////////////////////////2
lis=lis->next;
while(lis)
{
long SnD=c[kc];
kc++;
if(kc>=len)break;
if(SnD)
{
////////////////////////////1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -