Как мне выполнить лучшую функцию раскрашивания? - PullRequest
0 голосов
/ 20 мая 2009

Дубликат https://stackoverflow.com/questions/885696/how-do-i-perform-a-better-colorize-function

Я использую эту функцию в vb2005 для раскрашивания пикселя, однако, когда пользователь выбирает цвет> 50, я начинаю терять детализацию на изображении, есть идеи, как это исправить?

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

1 Ответ

0 голосов
/ 20 мая 2009

Ну, я в основном парень на C #, но хорошая формула примерно такая:

rNew = (grayVal.R / 2) + (colorize.R / 2)

Или, если вы предпочитаете арифметику с плавающей точкой:

rNew = (0.5F * grayval.R) + (0.5F * colorize.R)

Вторая функция - это общая функция наложения, настроенная на смесь 50/50. Вы можете изменить константы, чтобы получить другое соотношение. Обратите внимание, что, если Option Explicit включен, вы должны привести Grayval.R и Colorize.R к плавающим!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...