2009-05-20 4 views
0

Дубликат 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 

ответ

0

Ну, я в основном C# парень, но хорошая формула что-то вроде этого:

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

Или, если вы предпочитаете с плавающей запятой arithmatec:

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

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