How to do the best coloring function?
Duplicate https://stackoverflow.com/questions/885696/how-do-i-perform-a-better-colorize-function
I use this function in vb2005 to colorize a pixel, however when the user selects a color> 50 I start 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
0
a source to share
1 answer
Well, I'm basically a C # guy, but a good formula is something like this:
rNew = (grayVal.R / 2) + (colorize.R / 2)
Or, if you prefer floating point arithmetic:
rNew = (0.5F * grayval.R) + (0.5F * colorize.R)
The second is the general overlay function set to 50/50 mix. You can change the constants to get a different ratio. Note that if Option Explicit is on you must cast grevalval.R and colorize.R into floats!
0
a source to share