📄 jpeg_ls.cpp
字号:
else if(Di[i]<T1) Qi[i]=1;
else if(Di[i]<T2) Qi[i]=2;
else if(Di[i]<T3) Qi[i]=3;
else Qi[i]=4;
}
// **********************************************
// * 完成从矢量(Q1,Q2,Q3)到Q的一一对应的映射 *
// **********************************************
if((Qi[1]<0)||((Qi[1]==0)&&(Qi[2]<0))||(((Qi[1]==0)&&(Qi[2]==0))&&(Qi[3]<0)))
SIGN=-1;
else SIGN=1;
if(SIGN==-1)
{
for(i=1;i<4;i++)
Qi[i]=Qi[i]*SIGN;
}
Q=(Qi[1]*9+Qi[2])*9+Qi[3];
// *********************
// * 计算Px的值 *
// *********************
/* if(Rc>=__max(Ra,Rb)){
Px=__min(Ra,Rb);
c=1;
if(Rc-__max(Ra,Rb)>=10)
Px--; }
else{
if(Rc<=__min(Ra,Rb)){
Px=__max(Ra,Rb);
c=1;
if(__min(Ra,Rb)-Rc>=10)
Px++;}
else{
Px=Ra+Rb-Rc;
c=0;}
}
if(c==0)
Px=(Px+Ra+Rb)/3;*/
/*if(Rc<=__max(Ra,Rb)){
if(Rc<=__min(Ra,Rb)){
if((10<=(Rd-Rb))&&(abs(Ra-Rb))<=10&&(__min(Ra,Rb)-Rc)>=5&&(Rd-Rb)<=50)
Px=Rd/2+__max(Ra,Rb)/2;
else
Px=__max(Ra,Rb);}
else
Px=Ra+Rb-Rc;}
else{
if(Rc-Ra>=10&&Rd<Rb&&Ra-Rb<=5)
Px=Rd/2+__min(Ra,Rb)/2;
else
Px=__min(Ra,Rb);
}*/
if(Rc>=__max(Ra,Rb))
Px=__min(Ra,Rb);
else{
if(Rc<=__min(Ra,Rb))
Px=__max(Ra,Rb);
else
Px=Ra+Rb-Rc;
}
if(SIGN==1)
Px=Px+C[Q];
else
Px=Px-C[Q];
// **********************************
// * 将Px规整到(0..MAXVAL)的范围 *
// **********************************
if(Px>MAXVAL)
Px=MAXVAL;
else if(Px<0)
Px=0;
// ******************************************************
// * 从码流中恢复重建值Rx *
// ******************************************************
k=LG(Q);
if(decode!=0)/*之前为游程解码,当一个单元未处理就转入常规编码时,处理剩下的部分*/
{
while(((1<<(size-1))&decode)==0)/*读一元码*/
{
size--;
cnt++;
}
size--;
if(size==0)
decode=0;
else
decode=(decode<<(32-size))>>(32-size);
}
else{
while(decode==0)
{
fread(&buffer,1,1,fp);
decode=buffer;
size=size+8;/*以8bit为单位处理*/
cnt=size;
}
q=7;/*预设高几位形成的q=7(是处理单元能达到的最大值)*/
while(((1<<q)&decode)==0)
q--;
cnt=cnt-8+7-q;/*0的个数*/
if(q==0)
decode=0;
else
decode=(decode<<(32-q))>>(32-q);/*处理后k位,之前置零*/
size=q;
}
if(cnt<(LIMIT-qbpp-1))/*情况1*/
{
if(k<=size)
{
output=decode>>(size-k);/*得到后k位*/
if(size-k==0)
decode=0;
else
decode=((decode<<(32-size+k)))>>(32-size+k);/*此次处理结束,置零*/
size=size-k;
}
else
{
fread(&buffer,1,1,fp);
decode1=0;
if(k-size<=8)
decode1=decode<<(k-size);
while(k-size>8)
{
decode1=decode1+(decode<<(k-size))+(buffer<<(k-size-8));
k=k-8;
fread(&buffer,1,1,fp);
decode=0;
}
output=decode1+(buffer>>(8+size-k));/*第二项表示在k<size的单元里,得到当前的k位数*/
if(8-k+size==0)
decode=0;
else
decode=(buffer<<(32-8+k-size))>>(32-8+k-size);/*处理结束,置零*/
size=8-k+size;
}
MErrval=(cnt<<k)+output;
}
else/*情况2*/
{
if(qbpp<=size)
{
output=decode>>(size-qbpp);
if(size==qbpp)
decode=0;
else
decode=((decode<<(32-size+qbpp)))>>(32-size+qbpp);
size=size-qbpp;
}
else
{
fread(&buffer,1,1,fp);
decode1=0;
if(qbpp-size<=8)
decode1=decode<<(qbpp-size);
while(qbpp-size>8)
{
decode1=decode1+(decode<<(qbpp-size))+(buffer<<(qbpp-size-8));
qbpp=qbpp-8;
fread(&buffer,1,1,fp);
decode=0;
}
output=decode1+(buffer>>(8+size-qbpp));
if(8-qbpp+size==0)
decode=0;
else
decode=(buffer<<(32-8+qbpp-size))>>(32-8+qbpp-size);
size=8-qbpp+size;
}
MErrval=output+1;
}
if((NEAR==0)&&(k==0)&&(2*B[Q]<=-N[Q]))
{
if((MErrval&1)==1)
Errval=(MErrval-1)>>1;
else
Errval=(-(MErrval>>1))-1;
}
else
{
if((MErrval&1)==0)
Errval=((MErrval)>>1);
else
Errval=-((MErrval+1)>>1);
}
// *********************************
// * 更新各个变量 *
// *********************************
B[Q]=B[Q]+Errval*(2*NEAR+1);
A[Q]=A[Q]+abs(Errval);
if(N[Q]==RESET)
{
A[Q]=A[Q]>>1;
B[Q]=B[Q]>>1;
N[Q]=N[Q]>>1;
}
N[Q]=N[Q]+1;
Errval=Errval*(2*NEAR+1);
if(SIGN==-1)
Errval=-Errval;
Rx=Errval+Px;
if(Rx<(-NEAR))
Rx=Rx+RANGE*(2*NEAR+1);
else if(Rx>(MAXVAL+NEAR))
Rx=Rx-RANGE*(2*NEAR+1);
if(Rx<0)
Rx=0;
else if(Rx>MAXVAL)
Rx=MAXVAL;
*(f+LinX*(y+2)+RowX)=Rx;
if(B[Q]<=-N[Q])
{
B[Q]=B[Q]+N[Q];
if(C[Q]>MIN_C)
C[Q]=C[Q]-1;
if(B[Q]<=-N[Q])
B[Q]=-N[Q]+1;
}
else if(B[Q]>0)
{
B[Q]=B[Q]-N[Q];
if(C[Q]<MAX_C)
C[Q]=C[Q]+1;
if(B[Q]>0)
B[Q]=0;
}
}
long JPEG_LS::JPEG_LSEncoding(int *image, int height, int width)
{
int i,j,Ra,Rb,Rc,Rd,Ix,D1,D2,D3;
int BASIC_T1=3,BASIC_T2=7,BASIC_T3=21;
float T1,T2,T3;
struct timeb start_time,end_time;
int second_d;
int x,y;
x=height;
y=width;
CT=0;
Initial();
ftime(&start_time);
f=new int[(x+1)*(y+2)]; /*补零后的图像多两列,一行*/
if((fp=fopen("E:\\out.ls","wb"))==NULL)
{
AfxMessageBox("Can not Open File!");
}
// 计算各参数的值
for(i=1;i<=x;i++)
for(j=1;j<=y;j++)
{
*(f+i*(y+2)+j)=image[(i-1)*y+j-1];/*前面空一行,以作重建值。从第二行写起。此时补的行还是零,到后面预测时补入Rb等。*/
if(*(f+i*(y+2)+j)>MAXVAL)
MAXVAL=*(f+i*(y+2)+j);/*先求实际最大值*/
}
for(i=0;(1<<i)<=MAXVAL;i++);
MAXVAL=(1<<i)-1;/*规整到2的n次方故取大于实际MAXVAL的最小2的n次方*/
RANGE=((int)((MAXVAL+2*NEAR)/(2*NEAR+1)))+1;
qbpp=-(int)(floor(-log(RANGE)/log(2.0)));
bpp=__max(2,-(int)(floor(-log(MAXVAL+1)/log(2.0))));
LIMIT=2*(bpp+__max(8,bpp));
if(MAXVAL>=128)
{
T1=CLAMP_1((float)((int)(__min(MAXVAL,4095)+128)/256)*(BASIC_T1-2)+2+3*NEAR);
T2=CLAMP_2((float)((int)(__min(MAXVAL,4095)+128)/256)*(BASIC_T2-3)+3+5*NEAR,T1);
T3=CLAMP_3((float)((int)(__min(MAXVAL,4095)+128)/256)*(BASIC_T3-4)+4+7*NEAR,T2);
}
else
{
T1=CLAMP_1((float)__max(2,BASIC_T1/(int)(256/(MAXVAL+1))+3*NEAR));
T2=CLAMP_2((float)__max(3,BASIC_T2/(int)(256/(MAXVAL+1))+5*NEAR),T1);
T3=CLAMP_3((float)__max(4,BASIC_T3/(int)(256/(MAXVAL+1))+7*NEAR),T2);
}
// 对各数组的初始化
for(j=0;j<365;j++)
{
A[j]=__max(2,(RANGE+(1<<5))/(1<<6));
N[j]=1;
B[j]=0;
C[j]=0;
}
A[365]=A[0];
A[366]=A[0];
N[365]=1;
N[366]=1;
/*第一行及第二行第一个全为零*/
for(i=0;i<y+3;i++)
*(f+i)=0;
while(RowX<=y&&LinX<=x)/*到计算时间之前为大循环,一个一个象素处理*/
{
Ra=(*(f+LinX*(y+2)+RowX-1));
Rb=(*(f+(LinX-1)*(y+2)+RowX));
Rc=(*(f+(LinX-1)*(y+2)+RowX-1));
Rd=(*(f+(LinX-1)*(y+2)+RowX+1));
Ix=(*(f+LinX*(y+2)+RowX));
D1=Rd-Rb;
D2=Rb-Rc;
D3=Rc-Ra;
// 选择编码方式
if((abs(D1)<=NEAR)&&(abs(D2)<=NEAR)&&(abs(D3)<=NEAR))
RunModeProcessing(x,y,Ra,Rb,Rc,Rd,Ix);
else
RegularModeProcessing(y,Ra,Rb,Rc,Rd,Ix,D1,D2,D3,T1,T2,T3);
RowX++;
if(RowX==y)/*原图像一行的结尾(是补零后的倒数第二个象素)*/
{
*(f+(LinX+1)*(y+2))=*(f+LinX*(y+2)+1);/*处理下一行的第一个象素的上下文:将Rb赋给a*/
*(f+LinX*(y+2)+y+1)=*(f+LinX*(y+2)+y);/*处理当前行最后一个象素的上下文:将Rb赋给d*/
EOLine=1;
}
else
EOLine=0;
if(RowX>y)/*补零后的最后一个象素*/
{
RowX=RowX-y;/*也即rowx=1*/
LinX++;
}
}
if(cnt>0)
code=code<<(8-cnt);
fwrite(&code,1,1,fp);
CT=CT+1;
fclose(fp);
ftime(&end_time);
// 计算编码时间
second_d=end_time.millitm-start_time.millitm;
second_d=second_d+(end_time.time-start_time.time)*1000;
return CT;
// printf("The encoding costs:%.3f seconds.\n",(float)second_d/1000.0);
}
int* JPEG_LS::JPEG_LSDecoding(int width, int height)
{
int x,y,i,j;
int Ra,Rb,Rc,Rd,D1,D2,D3;
int BASIC_T1=3,BASIC_T2=7,BASIC_T3=21;
float T1,T2,T3;
int qbpp;
struct timeb start_time,end_time;
int second_d;
int *pData;
pData=new int[width*height];
x=height;y=width;
ftime(&start_time);
Initial();
//计算各参数的值
RANGE=((int)((MAXVAL+2*NEAR)/(2*NEAR+1)))+1;
qbpp=-(int)(floor(-log(RANGE)/log(2.0)));
bpp=__max(2,-(int)(floor(-log(MAXVAL+1)/log(2.0))));
LIMIT=2*(bpp+__max(8,bpp));
if(MAXVAL>=128)
{
T1=CLAMP_1((float)((int)(__min(MAXVAL,4095)+128)/256)*(BASIC_T1-2)+2+3*NEAR);
T2=CLAMP_2((float)((int)(__min(MAXVAL,4095)+128)/256)*(BASIC_T2-3)+3+5*NEAR,T1);
T3=CLAMP_3((float)((int)(__min(MAXVAL,4095)+128)/256)*(BASIC_T3-4)+4+7*NEAR,T2);}
else
{
T1=CLAMP_1((float)__max(2,BASIC_T1/(int)(256/(MAXVAL+1))+3*NEAR));
T2=CLAMP_2((float)__max(3,BASIC_T2/(int)(256/(MAXVAL+1))+5*NEAR),T1);
T3=CLAMP_3((float)__max(4,BASIC_T3/(int)(256/(MAXVAL+1))+7*NEAR),T2);
}
f= new int[(x+1)*(y+2)];
if((fp=fopen("E:\\out.ls","rb"))==NULL)
{
AfxMessageBox("Can not Open File!");
}
// 对各数组的初始化
for(j=0;j<365;j++)
{
A[j]=__max(2,(RANGE+(1<<5))/(1<<6));
N[j]=1;
B[j]=0;
C[j]=0;
}
A[365]=A[0];
A[366]=A[0];
N[365]=1;
N[366]=1;
// 读入变量
for(i=0;i<(x+1)*(y+2);i++)
*(f+i)=0;
while(RowX<=y&&LinX<=x)
{
Ra=(*(f+LinX*(y+2)+RowX-1));
Rb=(*(f+(LinX-1)*(y+2)+RowX));
Rc=(*(f+(LinX-1)*(y+2)+RowX-1));
Rd=(*(f+(LinX-1)*(y+2)+RowX+1));
D1=Rd-Rb;
D2=Rb-Rc;
D3=Rc-Ra;
// 选择解码方式
if((abs(D1)<=NEAR)&&(abs(D2)<=NEAR)&&(abs(D3)<=NEAR))
RunModeProcessing(qbpp,Ra,Rb,y);
else
DeModeProcessing(qbpp,Ra,Rb,Rc,Rd,D1,D2,D3,y,T1,T2,T3);
if(RowX==y)
{
*(f+LinX*(y+2)+y+1)=*(f+LinX*(y+2)+y);
*(f+(LinX+1)*(y+2))=*(f+LinX*(y+2)+1);
}
RowX++;
if(RowX>y)
{
RowX=RowX-y;
LinX++;
}
}
fclose(fp);
// 文件输出格式选择
if((fp=fopen("E:\\de.raw","wb"))==NULL)
{
AfxMessageBox("Can not Open File!");
}
for(i=1;i<x+1;i++)
for(j=1;j<y+1;j++)
{
fwrite((f+i*(y+2)+j),1,1,fp);
pData[(i-1)*y+j-1]=*(f+i*(y+2)+j);
}
fclose(fp);
// 计算编码时间
ftime(&end_time);
second_d=end_time.millitm-start_time.millitm;
second_d=second_d+(end_time.time-start_time.time)*1000;
return pData;
// printf("The encoding costs:%.3f seconds.\n",(float)second_d/1000.0);
}
void JPEG_LS::Initial()
{
Nn[0]=0;
Nn[1]=0;
RANGE=0;
EOLine=0;
size=0;
LinX=1;RowX=1;
counter=0;
flag1=0;
cnt=0;code=0;pp=0;RUNindex=0;
buffer=0;output=0;decode=0;decode2=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -