?? dct.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 + -