xref: /MusicPlayer2/MusicPlayer2/GaussBlur.h (revision 877f5f92b251a01591a4960c885129aa589a8135)
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