浮雕的算法:
下一行的红绿蓝颜色分量减去上一行的红绿蓝颜色分量,再加上128
如果小于0,那么等于0,如果大于255,那么等于255
R=R(i-1,j)-R(i,j)+128
G=G(i-1,j)-G(i,j)+128
B=B(i-1,j)-B(i,j)+128
主要代码如下:
'浮雕1 Private Sub btnEmboss_Click(sender As Object,e As EventArgs) Handles btnEmboss.Click Dim pSourceColor1 As Color Dim pSourceColor2 As Color Dim pDestColor As Color Dim destImg As New Bitmap(sourceImg.Width,sourceImg.Height) Dim R,G,B As Integer Dim R1,G1,B1 As Integer Dim R2,G2,B2 As Integer For i As Integer = 1 To sourceImg.Width - 1 For j As Integer = 0 To sourceImg.Height - 1 pSourceColor1 = sourceImg.GetPixel(i,j) R1 = pSourceColor1.R G1 = pSourceColor1.G B1 = pSourceColor1.B pSourceColor2 = sourceImg.GetPixel(i - 1,j) R2 = pSourceColor2.R G2 = pSourceColor2.G B2 = pSourceColor2.B R = R1 - R2 + 128 G = G1 - G2 + 128 B = B1 - B2 + 128 If R < 0 Then R = 0 If R > 255 Then R = 255 If G < 0 Then G = 0 If G > 255 Then G = 255 If B < 0 Then B = 0 If B > 255 Then B = 255 pDestColor = Color.FromArgb(R,B) destImg.SetPixel(i,j,pDestColor) Next Next picDest.Image = destImg End Sub
运行效果如下:
我还看到了另外一个算法:
下一行的红绿蓝颜色分量减去上一行的红绿蓝颜色分量的绝对值,再加上128
如果小于0,那么等于0,如果大于255,那么等于255
R=Abs(R(i-1,j))+128
G=Abs(G(i-1,j))+128
B=Abs(B(i-1,j))+128
主要代码如下:
'浮雕2 Private Sub btnEmboss2_Click(sender As Object,e As EventArgs) Handles btnEmboss2.Click Dim pSourceColor1 As Color Dim pSourceColor2 As Color Dim pDestColor As Color Dim destImg As New Bitmap(sourceImg.Width,j) R2 = pSourceColor2.R G2 = pSourceColor2.G B2 = pSourceColor2.B R = Math.Min(Math.Abs(R1 - R2) + 128,255) G = Math.Min(Math.Abs(G1 - G2) + 128,255) B = Math.Min(Math.Abs(B1 - B2) + 128,255) pDestColor = Color.FromArgb(R,pDestColor) Next Next picDest.Image = destImg End Sub其中Math.Min(A,B)将返回A和B中较小的值。
运行效果如下:
由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。
学习更多vb.net知识,请参看 vb.net 教程 目录