📄 compress_first.cpp
字号:
/*
Compress_first.cpp
*/
#include "math.h"
extern short int subi, subj , ZZ[64] ;
extern short int hufsize[2][256], hufcode[2][256];
extern short int abc;
extern unsigned char initdata[256][256];
extern unsigned int DCHufIndex, ACHufIndex;
extern float dividata[8][8];
extern short int quantable[8][8];
/*
编码过程的代码
*/
void Divifunction() // 将读入的256*256个数据分割为8*8的小块
{
int i, j, m, n; //n表示行, m表示列。
i = subi;
j = subj;
for(n=0; n<8; n++)
for(m=0; m<8; m++)
{
dividata[n][m] = initdata[n+i*8][m+j*8];
}
}
void DctTrans() //进行FDCT变换
{
int i, j, u, v ; // i,j 表示DCT变换前的行列号; u,v表示变换后的行列号。
double subdata[8][8] = {0}, transdata[8][8]={0} ; //中间变量 矩阵赋0。
float con = 1/ sqrt(2), aa, bb;
for(u=0; u<8; u++)
{
if(u == 0) aa=con;
else aa=1;
for(v=0; v<8; v++)
{
if(v == 0) bb=con;
else bb=1;
for(i=0; i<8; i++)
{
for(j=0; j<8; j++)
{
subdata[i][v] += dividata[i][j]*cos(((2*j)+1)*v*3.1416/16) ;
if(j==7) subdata[i][v]=0.5*bb*subdata[i][v];
}
transdata[u][v] += subdata[i][v]*cos(((2*i)+1)*u*3.1416/16) ;
if(i==7) transdata[u][v]=0.5*aa*transdata[u][v];
}
}
}
for(i=0; i<8; i++)
for(j=0; j<8; j++) dividata[i][j] = transdata[i][j];
}
void Quanfunction() //量化函数
{
int i, j;
for(i=0; i<8; i++)
for(j=0; j<8; j++)
{
if(dividata[i][j]<0) dividata[i][j]= (int) (dividata[i][j]-quantable[i][j]/2)/quantable[i][j];
dividata[i][j]= (int) (dividata[i][j]+quantable[i][j]/2)/quantable[i][j];
}
}
void Zscan() //进行之字形扫描
{
if(subi==0 && subj==0) ZZ[0]= dividata[0][0];
else ZZ[0] = dividata[0][0] - ZZ[0];
ZZ[1]= dividata[0][1]; ZZ[2]= dividata[1][0]; ZZ[3]= dividata[2][0];
ZZ[4]= dividata[1][1]; ZZ[5]= dividata[0][2]; ZZ[6]= dividata[0][3]; ZZ[7]= dividata[1][2];
ZZ[8]= dividata[2][1]; ZZ[9]= dividata[3][0]; ZZ[10]= dividata[4][0]; ZZ[11]= dividata[3][1];
ZZ[12]= dividata[2][2]; ZZ[13]= dividata[1][3]; ZZ[14]= dividata[0][4]; ZZ[15]= dividata[0][5];
ZZ[16]= dividata[1][4]; ZZ[17]= dividata[2][3]; ZZ[18]= dividata[3][2]; ZZ[19]= dividata[4][1];
ZZ[20]= dividata[5][0]; ZZ[21]= dividata[6][0]; ZZ[22]= dividata[5][1]; ZZ[23]= dividata[4][2];
ZZ[24]= dividata[3][3]; ZZ[25]= dividata[2][4]; ZZ[26]= dividata[1][5]; ZZ[27]= dividata[0][6];
ZZ[28]= dividata[0][7]; ZZ[29]= dividata[1][6]; ZZ[30]= dividata[2][5]; ZZ[31]= dividata[3][4];
ZZ[32]= dividata[4][3]; ZZ[33]= dividata[5][2]; ZZ[34]= dividata[6][1]; ZZ[35]= dividata[7][0];
ZZ[36]= dividata[7][1]; ZZ[37]= dividata[6][2]; ZZ[38]= dividata[5][3]; ZZ[39]= dividata[4][4];
ZZ[40]= dividata[3][5]; ZZ[41]= dividata[2][6]; ZZ[42]= dividata[1][7]; ZZ[43]= dividata[2][7];
ZZ[44]= dividata[3][6]; ZZ[45]= dividata[4][5]; ZZ[46]= dividata[5][4]; ZZ[47]= dividata[6][3];
ZZ[48]= dividata[7][2]; ZZ[49]= dividata[7][3]; ZZ[50]= dividata[6][4]; ZZ[51]= dividata[5][5];
ZZ[52]= dividata[4][6]; ZZ[53]= dividata[3][7]; ZZ[54]= dividata[4][7]; ZZ[55]= dividata[5][6];
ZZ[56]= dividata[6][5]; ZZ[57]= dividata[7][4]; ZZ[58]= dividata[7][5]; ZZ[59]= dividata[6][6];
ZZ[60]= dividata[5][7]; ZZ[61]= dividata[6][7]; ZZ[62]= dividata[7][6]; ZZ[63]= dividata[7][7];
}
/*
以下是解码过程代码
*/
void IZscan()
{
if(subi==0 && subj==0) dividata[0][0] = ZZ[0];
else dividata[0][0] = ZZ[0] + abc;
abc = dividata[0][0];
dividata[0][1]= ZZ[1]; dividata[1][0]= ZZ[2]; dividata[2][0]= ZZ[3];
dividata[1][1]= ZZ[4]; dividata[0][2]= ZZ[5]; dividata[0][3]= ZZ[6]; dividata[1][2]= ZZ[7];
dividata[2][1]= ZZ[8]; dividata[3][0]= ZZ[9]; dividata[4][0]= ZZ[10]; dividata[3][1]= ZZ[11];
dividata[2][2]= ZZ[12]; dividata[1][3]= ZZ[13]; dividata[0][4]= ZZ[14]; dividata[0][5]= ZZ[15];
dividata[1][4]= ZZ[16]; dividata[2][3]= ZZ[17]; dividata[3][2]= ZZ[18]; dividata[4][1]= ZZ[19];
dividata[5][0]= ZZ[20]; dividata[6][0]= ZZ[21]; dividata[5][1]= ZZ[22]; dividata[4][2]= ZZ[23];
dividata[3][3]= ZZ[24]; dividata[2][4]= ZZ[25]; dividata[1][5]= ZZ[26]; dividata[0][6]= ZZ[27];
dividata[0][7]= ZZ[28]; dividata[1][6]= ZZ[29]; dividata[2][5]= ZZ[30]; dividata[3][4]= ZZ[31];
dividata[4][3]= ZZ[32]; dividata[5][2]= ZZ[33]; dividata[6][1]= ZZ[34]; dividata[7][0]= ZZ[35];
dividata[7][1]= ZZ[36]; dividata[6][2]= ZZ[37]; dividata[5][3]= ZZ[38]; dividata[4][4]= ZZ[39];
dividata[3][5]= ZZ[40]; dividata[2][6]= ZZ[41]; dividata[1][7]= ZZ[42]; dividata[2][7]= ZZ[43];
dividata[3][6]= ZZ[44]; dividata[4][5]= ZZ[45]; dividata[5][4]= ZZ[46]; dividata[6][3]= ZZ[47];
dividata[7][2]= ZZ[48]; dividata[7][3]= ZZ[49]; dividata[6][4]= ZZ[50]; dividata[5][5]= ZZ[51];
dividata[4][6]= ZZ[52]; dividata[3][7]= ZZ[53]; dividata[4][7]= ZZ[54]; dividata[5][6]= ZZ[55];
dividata[6][5]= ZZ[56]; dividata[7][4]= ZZ[57]; dividata[7][5]= ZZ[58]; dividata[6][6]= ZZ[59];
dividata[5][7]= ZZ[60]; dividata[6][7]= ZZ[61]; dividata[7][6]= ZZ[62]; dividata[7][7]= ZZ[63];
}
void IQuanfunction()
{
int i, j;
for(i=0; i<8; i++)
for(j=0; j<8; j++)
{
dividata[i][j]= dividata[i][j] * quantable[i][j];
}
}
//有问题???????????????
void IDctTrans()
{
int i, j, u, v ; // i,j 表示DCT变换前的行列号; u,v表示变换后的行列号。
double subdata[8][8] = {0}, transdata[8][8]={0} ; //中间变量 矩阵赋0。
float con = 1/sqrt(2), aa, bb;
for(i=0; i<8; i++)
{
for(j=0; j<8; j++)
{
for(u=0; u<8; u++)
{
if(u==0) aa=con;
else aa=1;
for(v=0; v<8; v++)
{
if(v==0) bb=con ;
else bb=1;
subdata[u][j] += dividata[u][v]*cos(((2*v)+1)*j*3.1416/16) ;
if(j==7) subdata[u][j]=0.5*aa*bb*subdata[u][j]; // 逆变换这样做不知道对否????
}
transdata[u][v] += subdata[i][v]*cos(((2*i)+1)*u*3.1416/16) ;
if(i==7) transdata[u][v]=0.5*con*transdata[u][v]; // 乘的系数还有问题???
}
}
}
for(i=0; i<8; i++)
for(j=0; j<8; j++) dividata[i][j] = transdata[i][j];
}
void Composefunction()
{
int i, j, m, n; //n表示行, m表示列。
i = subi;
j = subj;
for(n=0; n<8; n++)
for(m=0; m<8; m++)
{
initdata[n+i*8][m+j*8] = dividata[n][m];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -