Duplicate of http://stackoverflow.com/questions/885696/how-do-i-perform-a-better-colorize-function
I am using this function in vb2005 to colorize a pixel, however when a user chooses a color >50 i begin to lose detail in the image, any idea how i can fix this?
Private badcolor As Color = Color.FromArgb(0, 0, 0, 0)
Public Function grayscalePixel(ByVal basecolor As Color) As Color
Return grayscalePixel(basecolor, 0.3, 0.59, 0.11)
End Function
Public Function grayscalePixel(ByVal basecolor As Color, ByVal RedMix As Double, ByVal GreenMix As Double, ByVal BlueMix As Double) As Color
If basecolor.A = 0 Then
Return badcolor
End If
If (RedMix + GreenMix + BlueMix > 1) Or (RedMix + GreenMix + BlueMix <= 0) Then
Return grayscalePixel(basecolor)
End If
Dim grayval As Integer = basecolor.R * RedMix + basecolor.G * GreenMix + basecolor.B * BlueMix
Return Color.FromArgb(basecolor.A, grayval, grayval, grayval)
End Function
Public Function colorizePixel(ByVal basecolor As Color, ByVal colorize As Color) As Color
If basecolor.A = 0 Then
Return badcolor
End If
Dim grayval As Color = grayscalePixel(basecolor)
Dim r As Integer = Convert.ToInt32(grayval.R) + Convert.ToInt32(colorize.R)
Dim g As Integer = Convert.ToInt32(grayval.R) + Convert.ToInt32(colorize.G)
Dim b As Integer = Convert.ToInt32(grayval.R) + Convert.ToInt32(colorize.B)
If r > 255 Then
r = 255
End If
If g > 255 Then
g = 255
End If
If b > 255 Then
b = 255
End If
If r < 0 Then
r = 0
End If
If g < 0 Then
g = 0
End If
If b < 0 Then
b = 0
End If
Return Color.FromArgb(basecolor.A, r, g, b)
End Function