📄 jpegmath.cpp
字号:
{
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();
for(int y=0;y<lencodesize;y=y+2)
{
int reg=lencode->GetAt(y);
if(reg==0xf0)
{
vlclen=accodelen[reg];
r3=achuff[reg];
cnl=vlclen+vlccnt;
r3=r3>>(16-vlclen);
codeadd=(DWORD)r1;
codeadd=codeadd>>(8-vlccnt);
codeadd=codeadd<<vlclen;
codeadd=codeadd|(DWORD)r3;
y=y-1;
//AfxMessageBox("连续16个0");
}
else
{//foesle
int acmcl=lencode->GetAt(y)&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;
}
}//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;
}
}
}
}//第二层循环
} //最外层循环
jpegadd(r1,&jpegdatecode);
CByteArray* jpegout=new CByteArray;
jpegout->Copy(jpegdatecode);
//delete pdibbitc;
AfxMessageBox("编码结束");
return jpegout;
}
int nchange(BYTE len,WORD num)
{ int kk;
if(len==0)
kk=0;
else
{
WORD n;
n=num>>(len-1);
if(n==0)
{num=~num;
num=num<<(16-len);
num=num>>(16-len);
kk=(int)num;
kk=0-kk;
}
else
kk=(int)num;
}
return kk;
}
struct mybitfields
{ unsigned char c : 6;
unsigned char b:1;
unsigned char a : 1;
};
BOOL byteshift(BYTE* r,BYTE* phuf,int d)
{ int pbyte,pbit;
pbyte=(int)(d/8);
pbit=d%8;
//BYTE* phuf=new BYTE[5];
memcpy(phuf,r+pbyte,5);
for(int i=0; i<4; i++)
{*(phuf+i)=*(phuf+i)<<pbit;
BYTE temp;
temp=*(phuf+i+1);
temp=temp>>(8-pbit);
*(phuf+i)=*(phuf+i)|temp;
}
*(phuf+4)=*(phuf+4)<<d;
return TRUE;
}
double* ziginverse(int zigdct[64])
{BOOL lc=TRUE;
int n,m;
double* dctbit=new double[64];
int zig;
zig=0;
int offset;
for(int x=0;x<=7;x++)
{
if(lc)
lc=FALSE;
else
lc=TRUE;
if(lc)
{
for(n=0;n<=x;n++)
{ offset=8*n+x-n;//[n][x-n]
*(dctbit+offset)=(double)(*(zigdct+zig));
zig=zig+1;
}
}
else
{ for(m=0;m<=x;m++)
{ offset=8*(x-m)+m;
*(dctbit+offset)=(double)(*(zigdct+zig));
zig=zig+1;
}
}
}
int l=1;
for( x=8;x<=14;x++)
{
if(lc)
lc=FALSE;
else
lc=TRUE;
if(lc)
{
for(n=l;n<=x-l;n++)
{offset=8*n+x-n;//[n][x-n]
*(dctbit+offset)=(double)(*(zigdct+zig));
zig=zig+1;
}
}
else
{
for(m=l;m<=x-l;m++)
{
offset=8*(x-m)+m;
*(dctbit+offset)=(double)(*(zigdct+zig));
zig=zig+1;
}
}
l++;
}
return dctbit;
}
double c(int x)
{double y;
if(x ==0 )
y= 0.707106781;
else
y=1;
return y;
}
BYTE byteadd(double u)
{ BYTE pix;
int kk=(int)(u+128);
if(kk<0)
kk=0;
if(kk>255)
kk=255;
pix=(BYTE)kk;
return pix;
}
BYTE bytefix(double u)
{ BYTE pix;
int kk=(int)u;
if(kk<0)
kk=0;
if(kk>255)
kk=255;
pix=(BYTE)kk;
return pix;
}
BYTE byteadd(int u)
{ BYTE pix;
if(u<0)
u=0;
if(u>255)
u=255;
pix=(BYTE)u;
return pix;
}
BOOL ytableinit(WORD* dchuffbef,WORD* andbuf,BYTE* dccode,BYTE* accodelen,WORD* acandbuf,WORD* achuff,BYTE* dd,BYTE* hub)
{
WORD temp[12]={0x0000,0x4000,0x6000,0x8000,0xa000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00};
memcpy(dchuffbef,temp,12*sizeof(WORD));
WORD temp0[12]={0xc000,0xe000,0xe000,0xe000,0xe000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80};
memcpy(andbuf,temp0,12*sizeof(WORD));
BYTE temp1[12]={2,3,3,3,3,3,4,5,6,7,8,9};
memcpy(dccode,temp1,12);
BYTE temp2[37]={2,2,3,4,4,4,5,5,
5,6,6,7,7,7,7,8,
8,8,9,9,9,9,9,10,
10,10,10,10,11,11,11,11,
12,12,12,12,15};
memcpy(accodelen,temp2,37);
WORD temp3[37]={ 0xc000,0xc000,0xe000,0xf000,0xf000,0xf000,0xf800,0xf800,
0xf800,0xfc00,0xfc00,0xfe00,0xfe00,0xfe00,0xfe00,0xff00,
0xff00,0xff00,0xff80,0xff80,0xff80,0xff80,0xff80,0xffc0,
0xffc0,0xffc0,0xffc0,0xffc0,0xffe0,0xffe0,0xffe0,0xffe0,
0xfff0,0xfff0,0xfff0,0xfff0,0xfffe};
memcpy(acandbuf,temp3,37*sizeof(WORD));
WORD temp4[37]={0x0000,0x4000,0x8000,0xa000,0xb000,0xc000,0xd000,0xd800,
0xe000,0xe800,0xec00,0xf000,0xf200,0xf400,0xf600,0xf800,
0xf900,0xfa00,0xfb00,0xfb80,0xfc00,0xfc80,0xfd00,0xfd80,
0xfdc0,0xfe00,0xfe40,0xfe80,0xfec0,0xfee0,0xff00,0xff20,
0xff40,0xff50,0xff60,0xff70,0xff80};
memcpy(achuff,temp4,37*sizeof(WORD));
BYTE temp5[37]={ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
0x24, 0x33, 0x62, 0x72, 0x82};
memcpy(dd,temp5,37);
BYTE temp6[125]={0x09, 0x0a, 0x16,
0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
0xf9, 0xfa};
memcpy( hub,temp6,125);
return TRUE;
}
BOOL uvtableinit(WORD dchuffbef[12],WORD andbuf[12],BYTE dccode[12],BYTE accodelen[43],WORD acandbuf[43],WORD achuff[43],BYTE dd[43],BYTE hub[119])
{
WORD temp[12]={0x0000,0x4000,0x8000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80,0xffc0};
memcpy(dchuffbef,temp,12*sizeof(WORD));
WORD temp0[12]={0xc000,0xc000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80,0xffc0,0xffe0};
memcpy(andbuf,temp0,12*sizeof(WORD));
BYTE temp1[12]={2,2,2,3,4,5,6,7,8,9,10,11};
memcpy(dccode,temp1,12);
BYTE temp2[43]={ 2,2,3,4,4,5,5,5,5,6,
6,6,6,7,7,7,8,8,8,8,
9,9,9,9,9,9,9,10,10,10,
10,10,11,11,11,11,12,12,
12,12,14,15,15};
memcpy(accodelen,temp2,43);
WORD temp3[43]={0xc000,0xc000,0xe000,0xf000,0xf000,0xf800,0xf800,0xf800,
0xf800,0xfc00,0xfc00,0xfc00,0xfc00,0xfe00,0xfe00,0xfe00,
0xff00,0xff00,0xff00,0xff00,0xff80,0xff80,0xff80,0xff80,
0xff80,0xff80,0xff80,0xffc0,0xffc0,0xffc0,0xffc0,0xffc0,
0xffe0,0xffe0,0xffe0,0xffe0,0xfff0,0xfff0,0xfff0,0xfff0,
0xfffc,0xfffe,0xfffe};
memcpy(acandbuf,temp3,43*sizeof(WORD));
WORD temp4[43]={0x0000,0x4000,0x8000,0xa000,0xb000,0xc000,0xc800,0xd000,0xd800,0xe000,
0xe400,0xe800,0xec00,0xf000,0xf200,0xf400,0xf600,0xf700,0xf800,0xf900,
0xfa00,0xfa80,0xfb00,0xfb80,0xfc00,0xfc80,0xfd00,0xfd80,0xfdc0,0xfe00,
0xfe40,0xfe80,0xfec0,0xfee0,0xff00,0xff20,0xff40,0xff50,0xff60,0xff70,
0xff80,0xff84,0xff86};
memcpy(achuff,temp4,43*sizeof(WORD));
BYTE temp5[43]= {0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
0xe1,0x25,0xf1};
memcpy(dd,temp5,43);
BYTE temp6[119]={0x17,0x18,0x19,0x1a,0x26,0x27,0x28,0x29,0x2a,0x35,
0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,
0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,
0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,
0x85,0x86,0x87,0x88,0x89,0x8a,0x92,0x93,0x94,0x95,
0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,
0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,
0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,
0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,
0xda,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa};
memcpy(hub,temp6,119);
return TRUE;
}
int* Oneblock(int* qutable,int& block,WORD* dchuffbef,WORD* andbuf,BYTE* dccode,BYTE* accodelen,WORD* acandbuf,WORD* achuff,BYTE* dd,BYTE* hub,BYTE *jpegc,BYTE *jpegcode,int &dccoff,int &dc,int dct[64],int &shiftnumber,int acminlen,WORD a,WORD b,int eob)
{ WORD r1;
WORD r2;
WORD r3;
int k1;
int k2;
int point=0;
BYTE i=0;
bool juge;
juge=false;
int shiftsum;
while(!juge) //dc 系数解码
{ r2=*(jpegcode);
r2=r2<<8;
r2=r2|(WORD)(*(jpegcode+1));
r3=r2&andbuf[i];
juge=(r3==dchuffbef[i]);
if(juge)
{ shiftnumber+=dccode[i];
byteshift(jpegc,jpegcode,shiftnumber);//if1
shiftsum=dccode[i];
r1=*(jpegcode);
r1=r1<<8;
r2=r1|(WORD)(*(jpegcode+1));
r2=r2>>(16-i);
dccoff=nchange(i,r2);
if(block==0)
{
dct[0]=dccoff;
dc=dccoff;
}
else
{dct[0]=dccoff+dc;
dc=dct[0];
}
shiftnumber+=i;
byteshift(jpegc,jpegcode,shiftnumber);
point++;
}
i++;
}
//CString dct0;
//dct0.Format("%d",dct[0]);
// AfxMessageBox(dct0);
//AfxMessageBox("blockjiemakaishi");
while(point<64)
{ //mcu ac系数解码开始
//ac 系数解码
bool aclg=false;
int j;
j=0;
int jjj=0;
while(!aclg)
{
r2=*(jpegcode);
r2=r2<<8;
r2=r2|(WORD)(*(jpegcode+1));
r3=r2&acandbuf[j];
aclg=(r3==achuff[j]);
//
if(aclg)
{ //AfxMessageBox("acjiemakaishi");
jjj=j;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -