当前位置:C++技术网 > 资讯 > GDI+实现浮雕及雕刻滤镜

GDI+实现浮雕及雕刻滤镜

更新时间:2015-12-18 23:22:11浏览次数:1+次

“雕刻”效果就是对图像上的一个像素和它左上方的那个像素之间的擦慧之的一种处理过程,处理结果就是“雕刻”结果,这种处理是基于像素的。“雕刻”效果的算法是在相邻像素的差值加上一个常数(为了保持图片的灰度,可以考虑给这个差值加上一个灰度常数128),使得黑暗区域增加一些亮度。同时为了避免差值太小而引起图片过暗或因为差值太大而引起画面过亮,在编程过称中应该对差值进行具体控制。

所以,在编程的过程中只需要分别访问图像的每一个像素的RGB值,并将该RGB值与其左上方的像素进行差值运算,便能够很轻松的做出”雕刻“滤镜。需要注意的是,当设置一个像素值时,他和他左上方的像素都要被用到,为避免用到已经设置过的像素,应该从图像右下方的像素开始处理。

”浮雕"的处理则相反。

看代码:

void C油表View::OnGdiEnboss()
{
	// TODO: 在此添加命令处理程序代码
	this->RedrawWindow();
	CDC* pDC = GetDC();
	Graphics graphics(pDC->m_hDC);
	Bitmap image(L"cos.bmp");
	/////获取图像的高度和宽度
	INT Height = image.GetHeight();
	INT Width = image.GetWidth();
	/////对image2进行雕刻处理
	Bitmap *image2 = image.Clone(0, 0, Width, Height, PixelFormatDontCare);
	/////绘制原图
	graphics.DrawImage(&image, Rect(0, 0, Width, Height));
	////进行图片的雕刻处理
	///依次访问每个像素的处理
	Color color, colorTemp, colorLeft;
	for (int i = Width; i > 0; i--)
	{
		for (int j = Height; j > 0; j--)
		{
			///获取相邻两个像素的RGB值
			image.GetPixel(i, j, &color);
			image.GetPixel(i - 1, j - 1, &colorLeft);
			///计算与左上角像素的RGB份量之差
			///分量值之差被限制在67-128这两个数之间,更改这两个值会得到不同的效果
			float r = max(67, min(255, abs(color.GetRed() - colorLeft.GetRed() + 128)));
			float g = max(67, min(255, abs(color.GetGreen() - colorLeft.GetGreen() + 128)));
			float b = max(67, min(255, abs(color.GetBlue() - colorLeft.GetBlue() + 128)));
			colorTemp.SetValue(color.MakeARGB(255, r, g, b));
			////将计算后的RGB值写回位图
			image.SetPixel(i, j, colorTemp);
		}
		/////绘制雕刻图
		graphics.DrawImage(&image, Rect(Width, 0, Width, Height));
	}
	/////进行图片的浮雕处理
	for (int i = 0; i < Height; i++)
	{
		for (int j = 0; j < Width-1; j++)
		{
			image2->GetPixel(j, i, &color);
			image2->GetPixel(j + 1, i + 1, &colorLeft);
			////计算与右下角像素的分量之差
			////分量值之差被限制在67-128之间,更改这两个值会得到不同的效果
			float r = max(67, min(255, abs(color.GetRed() - colorLeft.GetRed() + 128)));
			float g = max(67, min(255, abs(color.GetGreen() - colorLeft.GetGreen() + 128)));
			float b = max(67, min(255, abs(color.GetBlue() - colorLeft.GetBlue() + 128)));
			colorTemp.SetValue(color.MakeARGB(255, r, g, b));
			image2->SetPixel(j, i, colorTemp);
		}
		///绘制浮雕图
		graphics.DrawImage(image2, Rect(Width * 2, 0, Width, image.GetHeight()));
	}
}
代码实现: