📄 jpegmath.cpp
字号:
AfxMessageBox(str);
return TRUE;
}
BYTE codelen(int x)
{ BYTE rlen=0;
if(x==0)
rlen=0;
else
{ int absx=abs(x);
while(absx!=1)
{ absx=absx>>1;
rlen++;
}
rlen++;
}
return rlen;
}
CByteArray* zerolencode(int qdct[64])
{
CByteArray lencode;
lencode.RemoveAll();
BYTE zerocnt=0;
int u;
for( u=1;u<64;u++)
{ if(qdct[u]==0)
{
zerocnt++;
if(zerocnt==16)
{ int eobtest=0;
for(int lu=u+1;lu<64;lu++)
{
if(qdct[lu]==0)
eobtest++;
}
if(eobtest==63-u)
{ BYTE b=0x00;
lencode.Add(b);
u=64;
}
else
{
BYTE b=0xf0;
lencode.Add(b);
zerocnt=0;
}
zerocnt=0;
}
else
{if(u==63)
{
BYTE b=0x00;
lencode.Add(b);
zerocnt=0;
}
}
}
else
{
BYTE rlen=codelen(qdct[u]);
BYTE sym1=(zerocnt<<4)|rlen;
lencode.Add(sym1);
BYTE qq=(char)qdct[u];
lencode.Add(qq);
zerocnt=0;
}
}
CByteArray* lencodeptr=new CByteArray;
lencodeptr->Copy(lencode);
return lencodeptr;
}
BOOL jpegadd(BYTE r1,CByteArray* jpegcode)
{//if(r1==0xff)
//{
//jpegcode->Add(r1);
//jpegcode->Add(0x00);
//}
//else
jpegcode->Add(r1);
return TRUE;
}
CByteArray* grayjpegencode(int width,int height,int widthbyte,BYTE* pdibbit, double quality)
{
/*int qutable[64]={16,11,12,14,12,10,16,14,
13,14,18,17,16,19,24,40,
26,24,22,22,24,19,35,37,
29,40,58,51,61,60,57,51,
56,55,64,72,92,78,64,68,
87,69,55,56,80,109,81,87,
95,98,103,104,103,62,77,113,
121,112,100,120,92,101,103,99};*/
int quta[64]={ 0x10,0x0B,0x0C,0x0E,0x0C,0x0A,0x10,0x0E,0x0D,0x0E,0x12,0x11,0x10,0x13,0x18,0x28,
0x1A,0x18,0x16,0x16,0x18,0x31,0x23,0x25,0x1D,0x28,0x3A,0x33,0x3D,0x3C,0x39,0x33,
0x38,0x37,0x40,0x48,0x5C,0x4E,0x40,0x44,0x57,0x45,0x37,0x38,0x50,0x6D,0x51,0x57,
0x5F,0x62,0x67,0x68,0x67,0x3E,0x4D,0x71,0x79,0x70,0x64,0x78,0x5C,0x65,0x67,0x63};
int qutable[64];
for(int t=0;t<64;t++)
{
qutable[t]=(int)(quta[t]*quality);
}
int linecnt=widthbyte;
BYTE* pdibbitc=new BYTE[linecnt*height];
for(int l=0;l<height;l++)
{
for(int lrm=0;lrm<linecnt;lrm++)
{
pdibbitc[linecnt*l+lrm]=pdibbit[(height-l-1)*linecnt+lrm];
}
}
BYTE* lpdibbit;
BYTE dccodelen[12];
WORD dchuff[12];
BYTE accodelen[251];
WORD achuff[251];
tableinit(dccodelen,dchuff,accodelen,achuff);
double pixsub[64];
CByteArray jpegdatecode;
jpegdatecode.RemoveAll();
int i,j;
i=0,j=0;
BYTE r1;
BYTE* r2;
WORD r3;
DWORD codeadd;//前缀加数值
int cnl; //总长度
int vlccnt;
int dcdiff=0;
for(j=0;j<height;j=j+8)
{ //最外层循环
for(i=0;i<width;i=i+8)
{ //第二层循环
for(int n=0;n<8;n++) //n wei hang
{//for1
for(int m=0;m<8;m++) //m wei lei
{
long i0=m+i;
long j0=n+j;
//lpdibbit=(BYTE*)(pdibbit+linecnt*(height-1-j0)+i0);//mcu 单元抽取
lpdibbit=(BYTE*)(pdibbitc+linecnt*j0+i0);
pixsub[n*8+m]=double((int)*lpdibbit-128);
}
}
fdct_2D(pixsub,3,3);//dct变换
double* zigdct;
zigdct=zigscan(pixsub);//zscan;
int qdct[64];
for(int u=0;u<64;u++)
{ if(zigdct[u]>0)
qdct[u]=(int)((zigdct[u]/qutable[u])+0.5);
else
qdct[u]=(int)((zigdct[u]/qutable[u])-0.5);
}
CByteArray* lencode;
lencode=zerolencode(qdct);
//开始熵编码
int vlclen;
int sw;
if((i==0) &(j==0))
{ //if1
short dccoff;
dccoff=qdct[0]-dcdiff;
int dcdifflen;
dcdifflen=codelen(dccoff);
if(dccoff<0)
{
dccoff=dcdiff-qdct[0];
dccoff=~dccoff;
dccoff=dccoff<<(16-dcdifflen);
dccoff=dccoff>>(16-dcdifflen);
}
dcdiff=qdct[0];
vlclen=dccodelen[dcdifflen];
cnl=dcdifflen+vlclen;
r3=dchuff[dcdifflen];
r3=r3>>(16-vlclen);
codeadd=(DWORD)r3;
codeadd=codeadd<<dcdifflen;
codeadd=codeadd|(DWORD)dccoff;
sw=(int)(cnl/8);
switch(sw)
{
case 2:
{ DWORD uu=codeadd;
uu=uu<<(24-cnl);
r2=(BYTE*)(&uu);
r1=*(r2+2);
jpegadd(r1,&jpegdatecode);
r1=*(r2+1);
jpegadd(r1,&jpegdatecode);
r1=*r2;
vlccnt=cnl-16;
break;
}
case 1:
{ DWORD uu=codeadd;
uu=uu<<(16-cnl);
r2=(BYTE*)(&uu);
r1=*(r2+1);
jpegadd(r1,&jpegdatecode);
r1=*r2;
vlccnt=cnl-8;
break;
}
case 0:{DWORD uu=codeadd;
uu=uu<<(8-cnl);
r2=(BYTE*)(&uu);
r1=*r2;
vlccnt=cnl;
break;
}
}
}//if1
else
{
short dccoff;
dccoff=qdct[0]-dcdiff;
int dcdifflen;
dcdifflen=codelen(dccoff);
if(dccoff<0)
{
dccoff=dcdiff-qdct[0];
dccoff=~dccoff;
dccoff=dccoff<<(16-dcdifflen);
dccoff=dccoff>>(16-dcdifflen);
}
dcdiff=qdct[0];
vlclen=dccodelen[dcdifflen];
cnl=dcdifflen+vlclen+vlccnt;
r3=dchuff[dcdifflen];
r3=r3>>(16-vlclen);
codeadd=(DWORD)r1;
codeadd=codeadd>>(8-vlccnt);
codeadd=codeadd<<vlclen;
codeadd=codeadd|(DWORD)r3;
codeadd=codeadd<<dcdifflen;
codeadd=codeadd|(DWORD)dccoff;
sw=(int)(cnl/8);
switch (sw)
{
case 3: {DWORD uu=(DWORD)codeadd;
uu=uu<<(32-cnl);
r2=(BYTE*)(&uu);
r1=*(r2+3);
jpegadd(r1,&jpegdatecode);
r1=*(r2+2);
jpegadd(r1,&jpegdatecode);
r1=*(r2+1);
jpegadd(r1,&jpegdatecode);
r1=*r2;
vlccnt=cnl-24;
break;
}
case 2: {DWORD uu=(DWORD)codeadd;
uu=uu<<(24-cnl);
r2=(BYTE*)(&uu);
r1=*(r2+2);
jpegadd(r1,&jpegdatecode);
r1=*(r2+1);
jpegadd(r1,&jpegdatecode);
r1=*r2;
vlccnt=cnl-16;
break;
}
case 1:{DWORD uu=(DWORD)codeadd;
uu=uu<<(16-cnl);
r2=(BYTE*)(&uu);
r1=*(r2+1);
jpegadd(r1,&jpegdatecode);
r1=*r2;
vlccnt=cnl-8;
break;
}
case 0:{DWORD uu=(DWORD)codeadd;
uu=uu<<(8-cnl);
r2=(BYTE*)(&uu);
r1=*r2;
vlccnt=cnl;
break;
}
}
}
//kaisi ac xishu
int lencodesize=lencode->GetSize();
//int y16=0;
int y=0;
while(y<lencodesize)
{
int reg=lencode->GetAt(y);
if(reg==240)
{
vlclen=accodelen[reg];
r3=achuff[reg];
cnl=11+vlccnt;
r3=r3>>(16-vlclen);
codeadd=(DWORD)r1;
codeadd=codeadd>>(8-vlccnt);
codeadd=codeadd<<vlclen;
codeadd=codeadd|(DWORD)r3;
//y16=1;
//AfxMessageBox("连续16个0");
y++;
}
else
{//foesle
int acmcl=reg&0x0f;//acmshuzichangdu
vlclen=accodelen[reg];
r3=achuff[reg];
cnl=vlclen+vlccnt+acmcl;
r3=r3>>(16-vlclen);
codeadd=(DWORD)r1;
codeadd=codeadd>>(8-vlccnt);
codeadd=codeadd<<vlclen;
codeadd=codeadd|(DWORD)r3;
if(reg!=0)
{
codeadd=codeadd<<acmcl;
BYTE sign=lencode->GetAt(y+1);
BYTE lenbuf;
if(sign>=128)
{lenbuf=(BYTE)255-lencode->GetAt(y+1)+1;
lenbuf=(~lenbuf)&(0xff>>(8-acmcl));//可能有错
}
else
lenbuf=sign;
codeadd=codeadd|(DWORD)lenbuf;
}
y+=2;
}//foelse
sw=(int)(cnl/8);
switch (sw)
{
case 3: {DWORD uu=(DWORD)codeadd;
uu=uu<<(32-cnl);
r2=(BYTE*)(&uu);
r1=*(r2+3);
jpegadd(r1,&jpegdatecode);
r1=*(r2+2);
jpegadd(r1,&jpegdatecode);
r1=*(r2+1);
jpegadd(r1,&jpegdatecode);
r1=*r2;
vlccnt=cnl-24;
break;
}
case 2: {DWORD uu=(DWORD)codeadd;
uu=uu<<(24-cnl);
r2=(BYTE*)(&uu);
r1=*(r2+2);
jpegadd(r1,&jpegdatecode);
r1=*(r2+1);
jpegadd(r1,&jpegdatecode);
r1=*r2;
vlccnt=cnl-16;
break;
}
case 1:{DWORD uu=(DWORD)codeadd;
uu=uu<<(16-cnl);
r2=(BYTE*)(&uu);
r1=*(r2+1);
jpegadd(r1,&jpegdatecode);
r1=*r2;
vlccnt=cnl-8;
break;
}
case 0:{DWORD uu=(DWORD)codeadd;
uu=uu<<(8-cnl);
r2=(BYTE*)(&uu);
r1=*r2;
vlccnt=cnl;
break;
}
}
}
/*if(y16==1)
{
CString hu;
hu.Format("y=%d,lencodesize=%d",y,lencodesize);
AfxMessageBox(hu);
}*/
}//第二层循环
} //最外层循环
jpegadd(r1,&jpegdatecode);
CByteArray* jpegout=new CByteArray;
jpegout->Copy(jpegdatecode);
delete pdibbitc;
//delete lencode;
AfxMessageBox("编码结束");
return jpegout;
}
CByteArray* grayjpegencode(int width,int height,int widthbyte,int* pdibbit,double quality)
{
int quta[64]={ 0x10,0x0B,0x0C,0x0E,0x0C,0x0A,0x10,0x0E,0x0D,0x0E,0x12,0x11,0x10,0x13,0x18,0x28,
0x1A,0x18,0x16,0x16,0x18,0x31,0x23,0x25,0x1D,0x28,0x3A,0x33,0x3D,0x3C,0x39,0x33,
0x38,0x37,0x40,0x48,0x5C,0x4E,0x40,0x44,0x57,0x45,0x37,0x38,0x50,0x6D,0x51,0x57,
0x5F,0x62,0x67,0x68,0x67,0x3E,0x4D,0x71,0x79,0x70,0x64,0x78,0x5C,0x65,0x67,0x63};
int qutable[64];
for(int t=0;t<64;t++)
{
qutable[t]=(int)(quta[t]*quality);
}
int linecnt=widthbyte;
//int* pdibbitc=new int[linecnt*height];
//for(int l=0;l<height;l++)
//{
// for(int lrm=0;lrm<linecnt;lrm++)
//{
// pdibbitc[linecnt*l+lrm]=pdibbit[(height-l-1)*linecnt+lrm];
//}
//}
int* lpdibbit;
BYTE dccodelen[12];
WORD dchuff[12];
BYTE accodelen[251];
WORD achuff[251];
tableinit(dccodelen,dchuff,accodelen,achuff);
double pixsub[64];
CByteArray jpegdatecode;
jpegdatecode.RemoveAll();
int i,j;
i=0,j=0;
BYTE r1;
BYTE* r2;
WORD r3;
DWORD codeadd;//前缀加数值
int cnl; //总长度
int vlccnt;
int dcdiff=0;
for(j=0;j<height;j=j+8)
{ //最外层循环
for(i=0;i<width;i=i+8)
{ //第二层循环
for(int n=0;n<8;n++) //n wei hang
{//for1
for(int m=0;m<8;m++) //m wei lei
{
long i0=m+i;
long j0=n+j;
lpdibbit=(int*)(pdibbit+linecnt*(height-1-j0)+i0);//mcu 单元抽取
//lpdibbit=(int*)(pdibbitc+linecnt*j0+i0);
pixsub[n*8+m]=(double)(*lpdibbit);
}
}
fdct_2D(pixsub,3,3);//dct变换
double* zigdct;
zigdct=zigscan(pixsub);//zscan;
int qdct[64];
for(int u=0;u<64;u++)
{ if(zigdct[u]>0)
qdct[u]=(int)((zigdct[u]/qutable[u])+0.5);
else
qdct[u]=(int)((zigdct[u]/qutable[u])-0.5);
}
CByteArray* lencode;
lencode=zerolencode(qdct);
//开始熵编码
int vlclen;
int sw;
if((i==0) &(j==0))
{ //if1
short dccoff;
dccoff=qdct[0]-dcdiff;
int dcdifflen;
dcdifflen=codelen(dccoff);
if(dccoff<0)
{
dccoff=dcdiff-qdct[0];
dccoff=~dccoff;
dccoff=dccoff<<(16-dcdifflen);
dccoff=dccoff>>(16-dcdifflen);
}
dcdiff=qdct[0];
vlclen=dccodelen[dcdifflen];
cnl=dcdifflen+vlclen;
r3=dchuff[dcdifflen];
r3=r3>>(16-vlclen);
codeadd=(DWORD)r3;
codeadd=codeadd<<dcdifflen;
codeadd=codeadd|(DWORD)dccoff;
sw=(int)(cnl/8);
switch(sw)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -