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

📄 dct.cpp

📁 实现jpeg的压缩编码功能 在demo2的工程文件中即可查看
💻 CPP
字号:
/**************************************************************************
Filename:	DCT.cpp.
Writer	:	Dai Zhiheng.
Time	:	2005-3-28.
Description: 
			2D BMP image's DCT transform 
			and 2D BMP image's DCT inverse transform.
***************************************************************************/
#include <fstream.h>
#include "BitFileHead.h"
#include "readOrWriteFile.h"
#include "DCT.h"
#include <math.h>
void main()
{
//定义文件
	char fileName[40]="";
	cout << "输入要变换的源BMP文件名(如\"C:\\\\Path1\\\\bmp1.bmp\"),如果在当前文件" <<endl;
	cout << "夹,直接写文件名及扩展名(.BMP),要求图片的长宽等于2的指数次方:" <<endl ;
	cin >> fileName;
	ifstream inFile;
	inFile.open(fileName,ios::binary);
	ofstream outFile;
	outFile.open("DCT.bmp",ios::binary);
	ofstream outFile1;
	outFile1.open("IDCT.bmp",ios::binary);
	cout <<endl << "………………………………………………………………………"<<endl;

//定义结构
	tagBITMAPHEADER bmfh;
	tagBITMAPINFOHEADER bmfih;

//读取图象相关信息
	bmfh.bfSize = readBfSize(inFile);
	cout <<"    文件大小为 : " <<dec <<bmfh.bfSize << " Bytes" <<endl; 

	bmfh.bfOffBits = readBfOffBits(inFile);
	cout <<"    数据区偏移位置 : " <<bmfh.bfOffBits <<endl;

	bmfih.biWidth = readBiWidth(inFile);
	cout <<"    图象宽度 :" <<bmfih.biWidth<<endl;

	bmfih.biHeight = readBiHeight(inFile);
	cout <<"    图象长度 :" <<bmfih.biHeight<<endl;	

	bmfih.biPlanes = readBiPlanes(inFile);
	cout <<"    位面个数:" <<bmfih.biPlanes <<endl;

	bmfih.biBitCount = readBiBitCount(inFile);
	cout <<"    位深度: "<<bmfih.biBitCount <<endl;

	bmfih.biSizeImage = readBiSizeImage(inFile);
	cout <<"    位图阵列大小:" ;
	//cout << bmfih.biSizeImage <<endl;
	cout <<bmfh.bfSize-bmfh.bfOffBits <<endl <<endl;

/************************************************************************************
*							以下为实际操作部分										*
*************************************************************************************/
//为操作申请内存区
	unsigned char *pbmpHeadBUF = new unsigned char[bmfh.bfOffBits];
	unsigned char *pbmpBits = new unsigned char[bmfh.bfSize-bmfh.bfOffBits];
	unsigned char *F = new unsigned char[bmfh.bfSize-bmfh.bfOffBits];
	double *X1 = new double[bmfh.bfSize-bmfh.bfOffBits];//为复数运算申请内存
	double *X2 = new double[bmfh.bfSize-bmfh.bfOffBits];


	int r;
	cout <<endl <<"输入DCT变换的阶数基数:";
	cin >> r;

//从BMP文件读取数据
	inFile.seekg(0);
	inFile.read(pbmpHeadBUF,bmfh.bfOffBits);
	inFile.read(pbmpBits,bmfh.bfSize-bmfh.bfOffBits);
	inFile.close();

//将数据变为double型:pbmpBits-->X1
	for(int i=0; i<bmfih.biHeight; i++)
		for(int j=0; j<bmfih.biWidth; j++)
		{
			*(X1 + i*bmfih.biWidth + j) = (double)(*(pbmpBits + (bmfih.biHeight-i-1)*bmfih.biWidth + j));
		}

//DCT正变换: X1-->X2
	 D2BMPDCT(X1,X2,bmfih.biHeight,bmfih.biWidth,r);

//写数据到图像:X-->F

	 for(i=0; i<bmfih.biHeight; i++)
		for(int j=0; j<bmfih.biWidth; j++)
	 {
		 if(*(X2 + i*bmfih.biWidth + j) > 255) *(F + (bmfih.biHeight-i-1)*bmfih.biWidth + j)=(unsigned char)255;
		 else if(*(X2 + i*bmfih.biWidth + j)<0) *(F + (bmfih.biHeight-i-1)*bmfih.biWidth + j)=(unsigned char)0;
		 else *(F + (bmfih.biHeight-i-1)*bmfih.biWidth + j)=(unsigned char)(*(X2 + i*bmfih.biWidth + j));
	 }
	outFile.seekp(0);
	outFile.write(pbmpHeadBUF, bmfh.bfOffBits);
	outFile.write(F, bmfh.bfSize-bmfh.bfOffBits);
//DCT反变换:X2-->X1
	ID2BMPDCT(X2,X1,bmfih.biHeight,bmfih.biWidth,r);

//写数据到图像:X1-->F
	for(i=0; i<bmfih.biHeight; i++)
		for(int j=0; j<bmfih.biWidth; j++)
		*(F + (bmfih.biHeight-i-1)*bmfih.biWidth + j)=(unsigned char)*(X1 + i*bmfih.biWidth + j);

	outFile1.seekp(0);
	outFile1.write(pbmpHeadBUF, bmfh.bfOffBits);
	outFile1.write(F,bmfh.bfSize-bmfh.bfOffBits);
//关闭文件,释放内存
	outFile.close();
	outFile1.close();
	delete [] X1;
	delete [] X2;

	delete [] pbmpHeadBUF;

	cout <<endl <<"变换完成!"<<endl <<endl <<"输出文件在当前文件夹:" <<endl <<endl;
	cout <<"    DCT正变换结果为:\"DCT.bmp\"" <<endl;
	cout <<"    DCT反变换结果为:\"IDCT.bmp\"" <<endl <<endl;
	cout <<"》》》》》是否结束程序?[Y/N]"<<endl;
	char inchar;
	while(1){
		cin  >>inchar;
		if((inchar == 'Y')||(inchar == 'y'))break;
	}
}

⌨️ 快捷键说明

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