⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compress_first.cpp

📁 bmp图像压缩 用哈夫曼算法实现的哦 很常用的
💻 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 + -