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

📄 dct.backup.cpp

📁 可以选择各种压缩方式对读入的图像进行压缩和解压
💻 CPP
字号:
#include "stdafx.h"
#include "dct.h"

#define PI 3.141593

btype JPEGTable[8][8]={16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,
                       14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,
				       18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,
				       49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99}; //标准量化表;

void mode2table(int mode, bool adapt, ptype **P, btype QTable[8][8]) {
	switch (mode) {
		case 1: 
			for (int i=0;i<8;i++)
				for (int j=0;j<8;j++)
					QTable[i][j]=65; //均匀
			break;
		case 2: 
			for (int i=0;i<8;i++)
				for (int j=0;j<8;j++)
					QTable[i][j]=10+8*(i+j); //变步长
			break;
		default: 
			for (int i=0;i<8;i++)
				for (int j=0;j<8;j++)
					QTable[i][j]=JPEGTable[i][j];//标准量化表
	}
}

blstype Quantization(ptype **a, unsigned int width, unsigned int height, btype (**Q)[8][8], btype QTable[8][8])
{
	btype (*QuanTable)[8][8];
	blstype NM;
	unsigned int nrow,ncolumn;
	btype va[8][8];
	double Dctcoefficient[8][8];

	nrow=height/8;
	ncolumn=width/8;
	NM=nrow*ncolumn;

	QuanTable=new btype [NM][8][8];
	*Q=QuanTable;

	for(unsigned int i=0;i<NM;i++)
	{
		int ij=i+10;
		for(int j=0;j<8;j++)
		{
			for(int k=0;k<8;k++)
			{
				va[j][k]=a[i/ncolumn*8+j][i%ncolumn*8+k]; //a[(i/ncolumn+j)*column+i%ncolumn*8+k]; 
			}
		}

		Fdct(va,Dctcoefficient);

		for(int j=0;j<8;j++)
		{
			for(int k=0;k<8;k++)
			{
				if(Dctcoefficient[j][k]>0)
					QuanTable[i][j][k]=btype(Dctcoefficient[j][k]/QTable[j][k]+0.5);
				else
					QuanTable[i][j][k]=btype(Dctcoefficient[j][k]/QTable[j][k]-0.5);
			}
		}
	}
	return NM;
}

int IQuantization(ptype ***P,  btype a[][8][8], unsigned int height, unsigned int width, btype QTable[8][8])
{
	ptype **IQuanTable=NULL;
	IQuanTable = new ptype *[height];
	if (!IQuanTable) {
		printf("Allocate height error.\n");
		return 1;
	}
	for (unsigned int j=0; j<height; j++) {
		IQuanTable[j]=new ptype [width];
		if (!IQuanTable[j]) {
			printf("Allocate width error.\n");
			return 1;
		}
	}
	*P=IQuanTable;

	double va[8][8];
	ptype vb[8][8];

	unsigned int nrow=height/8;
	unsigned int ncolumn=width/8;
	blstype NM=nrow*ncolumn;

	for(unsigned int i=0;i<NM;i++)
	{
		for(int u=0;u<8;u++)
			for(int v=0;v<8;v++)
				va[u][v]=a[i][u][v]*QTable[u][v];

		Idct(va,vb);

		for(int u=0;u<8;u++)
			for(int v=0;v<8;v++)
			    IQuanTable[i/ncolumn*8+u][i%ncolumn*8+v]=vb[u][v]; //[(i/ncolumn*8+u)*column+i%ncolumn*8+v]
	}
	return 0;
}

void Fdct(btype va[][8],double vb[][8])
 {
	double c;
	double CosTable[8][8]={1.0,0.98078528040323,0.92387953251129,0.83146961230255,0.70710678118655,0.55557023301960,0.38268343236509,0.19509032201613,
                           1.0,0.83146961230255,0.38268343236509,-0.19509032201613,-0.70710678118655,-0.98078528040323,-0.92387953251129,-0.55557023301960,
                           1.0,0.55557023301960,-0.38268343236509,-0.98078528040323,-0.70710678118655,0.19509032201613,0.92387953251129,0.83146961230255,
                           1.0,0.19509032201613,-0.92387953251129,-0.55557023301960,0.70710678118655,0.83146961230255,-0.38268343236509,-0.98078528040323,
                           1.0,-0.19509032201613,-0.92387953251129,0.55557023301960,0.70710678118655,-0.83146961230255,-0.38268343236509,0.98078528040323,
                           1.0,-0.55557023301960,-0.38268343236509,0.98078528040323,-0.70710678118655,-0.19509032201613,0.92387953251129,-0.83146961230255,
                           1.0,-0.83146961230255,0.38268343236509,0.19509032201613,-0.70710678118655,0.98078528040323,-0.92387953251129,0.55557023301960,
                           1.0,-0.98078528040323,0.92387953251129,-0.83146961230255,0.70710678118655,-0.55557023301960,0.38268343236509,-0.19509032201613};
	for(int u=0;u<8;u++)
	{
		for(int v=0;v<8;v++)
		{
			vb[u][v]=0.0;
			for(int j=0;j<8;j++)
				for(int k=0;k<8;k++)
					   vb[u][v]=vb[u][v]+va[j][k]*CosTable[j][u]*CosTable[k][v];
			if((0==u)&&(0==v))
				c=0.5;
			else if((0==u)||(0==v))
				c=1/sqrt(2.0);
			else
				c=1.0;
			vb[u][v]=c*vb[u][v]/4.0;
		}
	}
 }

 void Idct(double va[8][8],ptype vb[][8])
 {
	double c,d;
	double CosTable[8][8]={1.0,0.98078528040323,0.92387953251129,0.83146961230255,0.70710678118655,0.55557023301960,0.38268343236509,0.19509032201613,
                           1.0,0.83146961230255,0.38268343236509,-0.19509032201613,-0.70710678118655,-0.98078528040323,-0.92387953251129,-0.55557023301960,
                           1.0,0.55557023301960,-0.38268343236509,-0.98078528040323,-0.70710678118655,0.19509032201613,0.92387953251129,0.83146961230255,
                           1.0,0.19509032201613,-0.92387953251129,-0.55557023301960,0.70710678118655,0.83146961230255,-0.38268343236509,-0.98078528040323,
                           1.0,-0.19509032201613,-0.92387953251129,0.55557023301960,0.70710678118655,-0.83146961230255,-0.38268343236509,0.98078528040323,
                           1.0,-0.55557023301960,-0.38268343236509,0.98078528040323,-0.70710678118655,-0.19509032201613,0.92387953251129,-0.83146961230255,
                           1.0,-0.83146961230255,0.38268343236509,0.19509032201613,-0.70710678118655,0.98078528040323,-0.92387953251129,0.55557023301960,
                           1.0,-0.98078528040323,0.92387953251129,-0.83146961230255,0.70710678118655,-0.55557023301960,0.38268343236509,-0.19509032201613};
	for(int j=0;j<8;j++)
	{
		for(int k=0;k<8;k++)
		{
			d=0.0;
			for(int u=0;u<8;u++)
			{
				for(int v=0;v<8;v++)
				{
					if((0==u)&&(0==v))
						c=0.5;
					else if((0==u)||(0==v))
						c=1/sqrt(2.0);
					else
						c=1.0;
					d=d+c*va[u][v]*CosTable[j][u]*CosTable[k][v];
				}
			}
			if(d<=0)
				vb[j][k]=0;
			else {
				d=d/4+0.5;
				if (d>255)
					vb[j][k]=255;
				else
					vb[j][k]=ptype(d);
			}
		}
	}
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -