看板 C_and_CPP 關於我們 聯絡資訊
: BOOL CFilterFFT::Execute(CBmp *pImage)<---應該是作者自己把bitmap包成一個class : { //該bmp用的bit數不為8則會跳出警告,一般只用8 bits代表灰階圖 //作者希望只用8 bits = 2 ^ 8 = 256種顏色表示 //彩色的通常是RGB各8 bits代表,所以有24 bits : ASSERT(pImage->GetBitCount() == 8); <---看了解釋不懂 : 程式跑true沒事 跑false會跳error : // 循環控制變量 : int x; : int y; : // 圖像的高度和寬度 : int nWidth = pImage->GetWidth(); : int nHeight = pImage->GetHeight(); : //實際內存中的寬度 : int nWidthMemory = pImage->GetWidthMemory(); ↑這是因為有alignment的問題 : //圖像數據 : LPBYTE pImageData = pImage->GetBits();<--看CBmp中的定義,就下面用的 時候看起來是讓pImageData指 向bmp中真正存資料的地方的 開頭 原來你是不懂LP,LPBYTE = long pointer to a byte 在win32中常見 : // 臨時變量 : double dTemp; : // 傅立葉變換高度,2的冪數 : int nHeightFFT; : // 傅立葉變換寬度,2的冪數 : int nWidthFFT; : /*------------計算傅立葉變換的寬度和高度,是2的冪數------開始---*/ : dTemp = log(nWidth)/log(2); : dTemp = ceil(dTemp); : dTemp = pow(2,dTemp); : nWidthFFT = (int) dTemp; : dTemp = log(nHeight)/log(2); : dTemp = ceil(dTemp); : dTemp = pow(2,dTemp); : nHeightFFT = (int) dTemp; : /*------------計算傅立葉變換的寬度和高度,是2的冪數------結束---*/ : // 指向圖像數據的指針 : LPBYTE lpSrc; : // 指向空間域數據的指針 : complex<double> * pSpaceData; : // 指向頻域數據的指針 : complex<double> * pFrequencyData; : // 分配內存 : pSpaceData = new complex<double>[nWidthFFT * nHeightFFT]; : pFrequencyData = new complex<double>[nWidthFFT * nHeightFFT]; : if ((pSpaceData == NULL) || (pFrequencyData == NULL)) : { : return FALSE; : } : /*-------------- 初始化空間域數據-----------開始----------*/ : /* : * 圖像數據的寬和高不一定是2的整數次冪, : * pSpaceData有一部分數據需要補0 : */ : for(y=0; y<nHeightFFT; ++y) : { : for(x=0; x<nWidthFFT; ++x) : { : pSpaceData[y*nWidthFFT+x] = complex<double>(0, 0); : } : } : // 把圖像數據傳給pSpaceData : for(y=0; y<nHeight; ++y) : { : for(x=0; x<nWidth; ++x) : { : lpSrc = (LPBYTE) (pImageData + y * nWidthMemory + x) ; : //空間域乘以pow(-1, x+y),頻譜移至中心 : pSpaceData[y*nWidthFFT+x] = complex<double>((*lpSrc) * pow(-1, x+y),0); : } : } : /*-------------- 初始化空間域數據-----------結束----------*/ : //快速傅立葉變換 : FFT_2D(pSpaceData, nWidthFFT, nHeightFFT, pFrequencyData) ; : for(y=0; y<nHeight; ++y) : { : for(x=0; x<nWidth; ++x) : { : //取模 : dTemp = pFrequencyData[y * nWidthFFT + x].real() : * pFrequencyData[y * nWidthFFT + x].real() : + pFrequencyData[y * nWidthFFT + x].imag() : * pFrequencyData[y * nWidthFFT + x].imag(); : dTemp = sqrt(dTemp) / (double) nWidth; //除以因子N : // 圖像數據值小於255 : if(dTemp > 255) : { : dTemp = 255; : } : pImageData[y*nWidth+x] = (BYTE) dTemp; : } : } : // 釋放內存 : delete []pSpaceData; : delete []pFrequencyData; : pSpaceData = NULL; <--習慣問題 這邊看來是不用加 因為習慣判斷一個指標 有沒有指向東西是看是否為NULL,所以清空後習慣上 把值設回NULL : pFrequencyData = NULL; : return TRUE; : } 大致上是這樣 -- 三支女大十一三支女大十一三支女大十一三支女大十一三支女大十一三支女大十一 一十大女支三一十大女支三一十大女支三一十大女支三一十大女支三一十大女支三 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.5.25
NoobImage:請位w大你知道這是哪一種C語言嗎?這樣我查找速度快些 07/01 19:01
tinlans:世界上只有一種 C 語言。 07/01 19:23
bibo9901:而且這應該是C++不是C... 07/01 20:12
※ 編輯: winest 來自: 122.116.5.25 (07/02 00:10)