1 //实现高斯模糊的类,算法来自:http://www.cnblogs.com/hoodlum1980/p/4528486.html 2 #pragma once 3 4 class CGaussBlurThreadParams 5 { 6 public: 7 int r; 8 double* pTempl; 9 LPBYTE pSrc; //Src 位图的位图数据起点 (对所有线程,pSrc,pDest 是相同的) 10 LPBYTE pDest; //Dest 位图的位图数据起点 11 12 int width; //图像宽度 13 int height; //图像高度(已经被取绝对值) 14 15 //处理的行范围:[rowBegin, rowEnd) ,不包括 rowEnd (每个线程不同) 16 int rowBegin; 17 int rowEnd; 18 int stride; //扫描行宽度(bytes) 19 int pixelSize; //像素大小 =bpp/8; 20 21 bool bHorz; //true-水平模糊,false-纵向模糊 22 }; 23 24 25 class CGaussBlur 26 { 27 public: 28 CGaussBlur(); 29 ~CGaussBlur(); 30 31 void SetSigma(double sigma); //设置高斯模糊半径 32 void Reset(); 33 void DoGaussBlur(const CImage& image_src, CImage& image_dest); //对image_src执行高斯模糊,结果保存在image_dest里 34 35 protected: 36 int m_r; //完整模板正方形的边长为 (2 * r + 1) 37 double m_sigma; //高斯半径(方差的平方根) 38 double* m_pTempl; //模板T[r+1]; 39 40 bool Filter(LPCVOID pSrc, LPVOID pDest, int width, int height, int bpp); 41 42 DWORD WINAPI GaussBlurThreadProc8(LPVOID lpParameters); 43 DWORD WINAPI GaussBlurThreadProc24(LPVOID lpParameters); 44 }; 45 46