当前位置:C++技术网 > 资讯 > GDI+实现强光照射滤镜

GDI+实现强光照射滤镜

更新时间:2015-12-19 22:29:12浏览次数:1+次

使用强光照射滤镜的过程较为复杂。通常,对于强光的照射面可以选择是任意形状,但是圆像的照射面最为直接,这里以圆形照射面为例,谈谈强光照射滤镜的制作。
让画面改变亮度,只需要分别增加每一个像素的R,G,B值。问题的关键在于,让图片的那些像素变亮?对于圆形照射面的强光照射滤镜,主要看像素是否位于预定义的照射面之内。这点可以通过像素坐标来判断。比如,如果像素点A的坐标是(x,y——,强光的中心点是C(X,Y),照射面的半径是R,则像素点A与中心点C之间的关系如下:
Distance(A,C)>R:像素点在照射面之外。
Distance(A,C)=R:像素点在照射面的边线上。
Distance(A,C)<R:像素点在照射面内。
上面的公式说明了如何确认像素是否位于预定义的照射面之内。另一个问题就是对于照射面光晕的处理。
从光晕的分布来看,光源的中心点最亮,光强度随着离中心距离的增大而衰减。这个原理具体到编程之中,可以依据像素点距离光源中心点的距离来对R,G,B分量加上不同的值
void C油表View::OnGdiFlighting()
{
	// TODO: 在此添加命令处理程序代码
	this->RedrawWindow();
	CDC *pDC = GetDC();
	Graphics graphics(pDC->m_hDC);
	Bitmap image(L"cos.bmp");
	INT Width = image.GetWidth();
	INT Height = image.GetHeight();
	INT A = Width / 2;
	int B = Height / 2;
	////Center:图片中心,修改此值会让强光中心发生偏移
	CPoint Center(A, B);
	///R:强光照射面的半径,即:光晕
	int R = 100;
	Color colorTemp, color2;
	Color color;
	graphics.DrawImage(&image, Rect(0, 0, Width, Height));
	///依次访问每个像素
	for (int x = 0; x < Width; x++)
	{
		for (int y = 0; y < Height; y++)
		{
			CPoint tmp(x, y);
			/////如果像素位于“光晕”之内
			if (fDistance(tmp, Center) < R)
			{
				image.GetPixel(x, y, &color);
				float r, g, b;
				////根据该点距离强光中心点的距离,重新计算RGB分量
				////220:亮度增加常量,该值越大,光亮度越强
				r = color.GetRed() + 220 * (1 - fDistance(tmp, Center) / R);
				r = max(0, min(r, 255));
				g = color.GetRed() + 220 * (1 - fDistance(tmp, Center) / R);
				g = max(0, min(g, 255));
				b = color.GetRed() + 220 * (1 - fDistance(tmp, Center) / R);
				b = max(0, min(b, 255));
				colorTemp.SetValue(color2.MakeARGB(255, r, g, b));
				///将增亮后的像素回写到位图
				image.SetPixel(x, y, colorTemp);
			}
		}
		///动态绘制滤镜效果图
		graphics.DrawImage(&image, Rect(Width, 0, Width, Height));
	}
}

效果实现: