📄 jpegmath.cpp
字号:
dct[point+k1]=0;
point=point+k1+1;
}
}
else
{ r1=*(jpegcode);
r1=r1<<8;
r2=r1|(WORD)(*(jpegcode+1));
r2=r2>>(16-k2);
dct[point]=nchange(k2,r2);
point=point+1;
shiftnumber+=k2;
byteshift(jpegc,jpegcode,shiftnumber);
}
}
else
{
for(int n=point;n<64;n++)
{dct[n]=0;
point=64;
}
}
}
j++;
if(j==37 )
aclg=true;
}
if(j==37 && jjj!=36)
{ //xiabupanduan
r2=(WORD)*(jpegcode);
r2=r2<<8;
r2=r2|(WORD)(*(jpegcode+1));
if(r2>=0xff82 && r2<=0xfffe)
{ k1=hub[r2-0xff82];
k1=k1>>4;
k2=hub[r2-0xff82]&0x0f;
shiftnumber+=16;
byteshift(jpegc,jpegcode,shiftnumber);
if(k1)
{ int n;
for( n=point;n<point+k1;n++)
{dct[n]=0;
}
r1=*(jpegcode);
r1=r1<<8;
r2=r1|(WORD)(*(jpegcode+1));
r2=r2>>(16-k2);
dct[point+k1]=nchange(k2,r2);
point=point+k1+1;
shiftnumber+=k2;
byteshift(jpegc,jpegcode,shiftnumber);
}
else
{ r1=*(jpegcode);
r1=r1<<8;
r2=r1|(WORD)(*(jpegcode+1));
r2=r2>>(16-k2);
dct[point]=nchange(k2,r2);
point=point+1;
shiftnumber+=k2;
byteshift(jpegc,jpegcode,shiftnumber);
}
}
else
{ CString str;
str.Format("r2=%x",r2);
AfxMessageBox(str);
AfxMessageBox("jiemachuchuo");
}
}//xiabupanduan
}//mcuac系数解码结束
//dctfile.Write(dct,sizeof(dct));
for(int r=0; r<64;r++)
{
dct[r]=(int)(dct[r]*qutable[r]);
}
int col=(int)(block/rowblock);
int row=block%rowblock;
double* dctinverse=ziginverse(dct);
fidct_2D(dctinverse,3,3);
for(int x=0;x<8;x++)
{
for(int y=0;y<8;y++)
{
pdc->SetPixel(x+8*row,y+col*8,RGB(byteadd(dctinverse[8*y+x]),byteadd(dctinverse[8*y+x]),byteadd(dctinverse[8*y+x])));
}
}
for(int m0=0;m0<8;m0++)
{
for(int n0=0;n0<8;n0++)
{dctcoffdecode[(height-1-m0-8*col)*widthbyte+n0+8*row]=byteadd(dctinverse[8*m0+n0]);
}
}
block++;
CString str;
str.Format("第%d快解码",block);
pdc->TextOut(60,60,str);
}//总循环
CString ddd;
ddd.Format("shiftnumber=%d ",shiftnumber/8);
AfxMessageBox(ddd);
delete jpegcode;
delete jpeg;
return dctcoffdecode;
}
BOOL graydctdecode(int width,int height,int widthbyte,CByteArray* jpeg,double quality,BYTE* dcc,BYTE* acc)
{
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);
}
//CFile dctfile;
//dctfile.Open("d:\\解码系数.txt",CFile::modeCreate|CFile::modeWrite);
// int coffcnt; //dct系数计数 以64为周期
int shiftnumber;//移位计数
int dccoff; //存储dc差分系数
int dc;//dc系数
int block; //解码块计数
int rowblock=width/8;//行块数
int colblock=height/8;//列块数
//int decodebit;//解码bit数
int dct[64];//存储dct系数
CByteArray aclen; //存储ac行程编码
aclen.RemoveAll();
LONG jpeglenth=jpeg->GetSize();
int ln=0;
while(ln<jpeg->GetSize())
{if(jpeg->GetAt(ln)==0xff && jpeg->GetAt(ln+1)==0x00)
jpeg->RemoveAt(ln+1);
ln++;
}
BYTE* jpegc=jpeg->GetData();
BYTE* jpegcode=new BYTE[5];
memcpy(jpegcode,jpegc,5);
block=0;
shiftnumber=0;
LONG codelen;
codelen=0;
WORD r1;
WORD r2;
WORD r3;
BYTE k1;//行程长
BYTE k2;//非零系数位长
WORD dchuffbef[12]={0x0000,0x4000,0x6000,0x8000,0xa000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00};
WORD andbuf[12]={0xc000,0xe000,0xe000,0xe000,0xe000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80};
BYTE dccode[12]={2,3,3,3,3,3,4,5,6,7,8,9};
BYTE accodelen[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};
WORD acandbuf[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};
WORD achuff[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};
BYTE dd[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};
BYTE hub[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};
int blocknum;
blocknum=(width/8)*(height/8);
//WORD r2;//前缀哈夫曼码
int point;
while(block<blocknum)
{ //AfxMessageBox("jiemakaishi"); //总循环
point=0;
BYTE i=0;
bool juge;
juge=false;
int shiftsum;
while(!juge) //dc 系数解码
{ if(i==12)
{AfxMessageBox("DC解码出错");
return FALSE;
}
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);
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]);
//AfxMessageBox("acjiemakaishi");
if(aclg)
{ //AfxMessageBox("acjiemakaishi");
jjj=j;
k1=dd[j];
k1=k1>>4;
k2=dd[j]&0x0f;
shiftnumber+=accodelen[j];
byteshift(jpegc,jpegcode,shiftnumber);
if(j!=3)//否则为eob
{int n;
if(k1!=0 )
{ if(dd[j]!=0xf0)
{
for(n=point;n<point+k1;n++)
{dct[n]=0;
}
r1=*(jpegcode);
r1=r1<<8;
r2=r1|(WORD)(*(jpegcode+1));
r2=r2>>(16-k2);
dct[point+k1]=nchange(k2,r2);
point=point+k1+1;
shiftnumber+=k2;
byteshift(jpegc,jpegcode, shiftnumber);
}
else
{
for(n=point;n<point+k1;n++)
{dct[n]=0;
}
dct[point+k1]=0;
point=point+k1+1;
}
}
else
{ r1=*(jpegcode);
r1=r1<<8;
r2=r1|(WORD)(*(jpegcode+1));
r2=r2>>(16-k2);
dct[point]=nchange(k2,r2);
point=point+1;
shiftnumber+=k2;
byteshift(jpegc,jpegcode,shiftnumber);
}
}
else
{
for(int n=point;n<64;n++)
{dct[n]=0;
point=64;
}
}
}
j++;
if(j==37 )
aclg=true;
}
if(j==37 && jjj!=36)
{ //xiabupanduan
r2=(WORD)*(jpegcode);
r2=r2<<8;
r2=r2|(WORD)(*(jpegcode+1));
if(r2>=0xff82 && r2<=0xfffe)
{ k1=hub[r2-0xff82];
k1=k1>>4;
k2=hub[r2-0xff82]&0x0f;
shiftnumber+=16;
byteshift(jpegc,jpegcode,shiftnumber);
if(k1)
{ int n;
for( n=point;n<point+k1;n++)
{dct[n]=0;
}
r1=*(jpegcode);
r1=r1<<8;
r2=r1|(WORD)(*(jpegcode+1));
r2=r2>>(16-k2);
dct[point+k1]=nchange(k2,r2);
point=point+k1+1;
shiftnumber+=k2;
byteshift(jpegc,jpegcode,shiftnumber);
}
else
{ r1=*(jpegcode);
r1=r1<<8;
r2=r1|(WORD)(*(jpegcode+1));
r2=r2>>(16-k2);
dct[point]=nchange(k2,r2);
point=point+1;
shiftnumber+=k2;
byteshift(jpegc,jpegcode,shiftnumber);
}
}
else
{ // CString str;
//str.Format("r2=%x",r2);
//AfxMessageBox(str);
//AfxMessageBox("jiemachuchuo");
aclen.RemoveAll();
delete jpegcode;
return FALSE;
}
}//xiabupanduan
}//mcuac系数解码结束
//dctfile.Write(dct,sizeof(dct));
for(int r=0; r<64;r++)
{
dct[r]=(int)(dct[r]*qutable[r]);
}
int col=(int)(block/rowblock);
int row=block%rowblock;
dcc[block]=dct[0]/8;
int averac;
int sum=0;
for(int p=1;p<9;p++);
{sum=sum+dct[p];}
averac=sum/8;
sum=0;
for(p=1;p<9;p++)
{int temp=dct[p]-averac;
sum=sum+temp*temp;
}
int ss=sqrt(sum/8);
acc[block]=ss;
block++;
// CString str;
//str.Format("第%d快解码",block);
//pdc->TextOut(60,60,str);
}//总循环
aclen.RemoveAll();
delete jpegcode;
//delete jpeg;
return TRUE;
}
BOOL Colordctdecode(int width,int height,int widthbyte,CByteArray* jpeg,double quality,BYTE* dcc,BYTE* acc)
{ 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 qutauv[64]={ 0x11,0x12,0x12,0x18,0x15,0x18,0x2F,0x1A,0x1A,0x2F,0x63,0x42,0x38,0x42,0x63,0x63,
0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63};
int qutable[64];
int qutableuv[64];
for(int t=0;t<64;t++)
{
qutable[t]=(int)(quta[t]*quality);
qutableuv[t]=(int)(qutauv[t]*quality);
}
;//移位计数
int dccoff=0; //存储dc差分系数
int uvblock=0;
int ln=0;
while(ln<jpeg->GetSize())
{if(jpeg->GetAt(ln)==0xff && jpeg->GetAt(ln+1)==0x00)
jpeg->RemoveAt(ln+1);
ln++;
}
int dct[64];//存储dct系数
CByteArray aclen; //存储ac行程编码
aclen.RemoveAll();
LONG jpeglenth=jpeg->GetSize();
BYTE* jpegc=jpeg->GetData();
BYTE* jpegcode=new BYTE[5];
memcpy(jpegcode,jpegc,5);
int shiftnumber=0;
LONG codelen;
codelen=0;
int ublock=0;;
int vblock=0;
int udc=0;
int vdc=0;
int udccoff=0;
int vdccoff=0;
int rowblock=width/16;//行块数
int colblock=height/16;//列块数
int blocknum=rowblock*colblock;
int dc=0;
//int blocknum4=4;
int rowblock4=2;
int height4=16;
int widthbyte4=16;
WORD dchuffbef[12];
WORD andbuf[12];
BYTE dccode[12];
BYTE accodelen[37];
WORD acandbuf[37];
WORD achuff[37];
BYTE dd[37];
BYTE hub[125];
WORD dchuffbef1[12];
WORD andbuf1[12];
BYTE dccode1[12];
BYTE accodelen1[43];
WORD acandbuf1[43];
WORD achuff1[43];
BYTE dd1[43];
BYTE hub1[119];
int mcublock=0;
//CString ddd;
//ddd.Format("shiftnumber=%d ",shiftnumber/8);
//AfxMessageBox(ddd);
while(mcublock<blocknum)
{ int block4=0;
//AfxMessageBox("jiemakaishi");
ytableinit(dchuffbef,andbuf,dccode,accodelen,acandbuf,achuff,dd,hub);
//CString dddd="";
//for(int uo=0;uo<5;uo++)
//{CString ddd;
//ddd.Format("%x ",jpegcode[uo]);
//dddd=dddd+ddd;
//}
//AfxMessageBox(dddd);
whil
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -