Jednoduchý algoritmus na částečné odbarvení obrázku...
Desaturace neboli odbarvení, je efekt poměrně důležitý a obrázky jím ošetřené jsou velice hezké. Efekt je velmi jednoduchý, stačí tvořit průměr všech barevných složek RGB a jednu z nich, tu, která má být výsledná, přidáme vícekrát.
Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Public Sub Desaturace (Img As PictureBox, Value As Long)
Const RGBMax = 256
Value = 16 - Value
Img.DrawWidth = 1
Img.ScaleMode = 3
Img.AutoRedraw = True
On Error Resume Next
For x = 0 To Img.ScaleWidth
For y = 0 To Img.ScaleHeight
DoEvents
Imgp = GetPixel(Img.hdc, x, y)
b = Imgp RGBMax RGBMax
g = (Imgp RGBMax) Mod RGBMax
r = Imgp Mod RGBMax
r1 = (g + b + Value * r) / (Value + 2)
g2 = (r + b + Value * g) / (Value + 2)
b3 = (r + g + Value * b) / (Value + 2)
Call SetPixel(Img.hdc, x, y, RGB(r1, g2, b3))
Next y
DoEvents
Next x
Img.Refresh
End Sub
Hodnota zadávaná do Value by měla být asi v rozmezí 0 – 15, jiné hodnoty můžou úplně změnit funkčnost algoritmu nebo výsledný efekt udělat velmi nepatrný. Čím vyšší je číslo, tím vyšší je i míra desaturace.
Mimo jiné, efekt není zrovna lineární, a tudíž rozdíl mezi čísly 14 a 15 je obrovský zatímco mezi čísly 1 a 2 je jen těžko rozeznatelný, takže je to na vaší matematice, jak se s tímto problémem dovedete vypřádat.