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







All Articles