ColorHSL(sävy, kylläisyys ja kirkkaus)

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

ColorHSL(sävy, kylläisyys ja kirkkaus)

Post by axu »

Tein tänään koulussa oman Hue Saturation Lightness systeemin(ei anna ihan samoja RGB-arvoja kuin "virallinen" HSL=>RGB muunnin).
Eli tämä funktio ottaa kolme arvoa väliltä 0-255, värin sävy, värikylläisyys sekä kirkkaus.
Koodi + esimerkki:

Code: Select all

SCREEN 255, 100
For i = 0 To 255
    ColorHSL(i, 255, 128)
    Line i, 0, i, 100
    DrawScreen OFF
Next i
WaitKey

Function ColorHSL(Hue#, Saturation#, Luminance#)
    Hue = (Hue/255.0)*360
    Saturation = Saturation / 2.0
    Color Min(255, Max(0, Luminance + (Cos(Hue)*Saturation))), Min(255, Max(0, Luminance + (Cos(Hue - 120)*Saturation))), Min(255, Max(0, Luminance + (Cos(Hue + 120)*Saturation)))
End Function
Ja jottei sikaa säkissä niin kuva, jossa on yllä Paint Shop Pro:n väriliuku ja alla minun.
Vertailukuva
Vertailukuva
Liuku.png (527 Bytes) Viewed 6419 times
Kuten kuvasta näkyy, niin ColorHSL tekee "sulavampia" värejä, kun PSP:llä ne vaihtuvat lineaarisesti kuten pitääkin.
EDIT:

Miten ihmeessä aina kun minä kirjoitan esimerkkeihin ja tutoihin jotain niin koko alue lamaantuu :D tämänkin viestin jälkeen on ollu hiljasta melkee 3 viikkoa XD

Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
Guest

Re: ColorHSL(sävy, kylläisyys ja kirkkaus)

Post by Guest »

Mahtava functio tuota olen jo pitkään kaivannut =)
thanks
Guest

Re: ColorHSL(sävy, kylläisyys ja kirkkaus)

Post by Guest »

Voisitko tehdä ton käänteisenä?
Guest

Re: ColorHSL(sävy, kylläisyys ja kirkkaus)

Post by Guest »

eli se pallauttaisi niinku RGB arvon kun annon sen sille.

Sori tuli triplapostaus.
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: ColorHSL(sävy, kylläisyys ja kirkkaus)

Post by axu »

Anteeksi en oikein ymmärtänyt :S Haluatko että se ottaisi vastaan RGB -arvot ja palauttaisi HSL arvot? Vai haluaisitko että funktio palauttaisi arvot esim. taulukossa(mikä lienee ilman kikkailua mahdotonta).
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
Guest

Re: ColorHSL(sävy, kylläisyys ja kirkkaus)

Post by Guest »

Eli sä annat rgb arvot ja se palauttaisi shl arvot.(kolme functiota)
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: ColorHSL(sävy, kylläisyys ja kirkkaus)

Post by axu »

Ei ainakaan nyt heti tule kirkkaana mieleen, miten kääntäisin tuon funktion toiminnan toisinpäin, ja saattaapi olla jopa lievästi mahdotonta, kun tuolla muuntoalgoritmillä ei kaiketi saa tulokseksi kaikkia RGB -arvoja katettua :?
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Re: ColorHSL(sävy, kylläisyys ja kirkkaus)

Post by KilledWhale »

Väsäsin teille pienet funktiot HSL <-> RGB muunnoksia varten. Lähteinä lähinnä wikipedia + muutama blitz basic koodi
Ohjelma piirtää teille kivan pienen väripaletin. CBn nopeus on sitä luokkaa että siihen vierähtää hieman aikaa.

Code: Select all

For x = 0 To 360
	For y = 0 To 255
		Color HSLtoRGB(x, 255, y, 1), HSLtoRGB(x, 255, y, 2), HSLtoRGB(x, 255, y, 3)
		Dot x, y
	Next y
Next x

DrawScreen
WaitKey

// Muuntaa HSL muodossa olevan värin RGB muotoon
// h# = väri (0 - 360)
// s# = kylläisyys (0 - 255)
// l# = valo (0 - 255)
// comp = palautettava komponentti (1 = R, 2 = G, 3 = B)
Function HSLtoRGB(h#, s#, l#, comp)
	s# = s# / 255
	l# = l# / 255
	h# = h# / 360
	
	If l# < 0.5 Then
		q# = l * (1.0 + s)
	Else
		q# = l + s - (l * s)
	EndIf
	
	p# = 2.0 * l - q
	
	tr# = h + 1.0 / 3.0
	tg# = h
	tb# = h - 1.0 / 3.0
	
	If tr < 0 Then
		tr = tr + 1
	ElseIf tr > 1 Then
		tr = tr - 1
	EndIf
	
	If tg < 0 Then
		tg = tg + 1
	ElseIf tg > 1 Then
		tg = tg - 1
	EndIf
	
	If tb < 0 Then
		tb = tb + 1
	ElseIf tb > 1 Then
		tb = tb - 1
	EndIf
	
	If tr# < 1.0 / 6.0 Then
		r# = p + ((q - p) * 6 * tr)
	ElseIf tr# < 1.0 / 2.0 Then
		r# = q
	ElseIf tr# < 2.0 / 3.0 Then
		r# = p + ((q - p) * 6 * (2.0 / 3.0 - tr)) 
	Else
		r# = p
	EndIf
	
	If tg# < 1.0 / 6.0 Then
		g# = p + ((q - p) * 6 * tg)
	ElseIf tg# < 1.0 / 2.0 Then
		g# = q
	ElseIf tg# < 2.0 / 3.0 Then
		g# = p + ((q - p) * 6 * (2.0 / 3.0 - tg)) 
	Else
		g# = p
	EndIf
	
	If tb# < 1.0 / 6.0 Then
		b# = p + ((q - p) * 6 * tb)
	ElseIf tb# < 1.0 / 2.0 Then
		b# = q
	ElseIf tb# < 2.0 / 3.0 Then
		b# = p + ((q - p) * 6 * (2.0 / 3.0 - tb)) 
	Else
		b# = p
	EndIf
	
	Select comp
		Case 1
			Return r * 255
		Case 2
			Return g * 255
		Case 3
			Return b * 255
	EndSelect
EndFunction

// Muuntaa RGB muodossa olevan värin HSL muotoon
// r# = punainen (0 - 255)
// g# = virhreä (0 - 255)
// b# = sininen (0 - 255)
// comp = palautettava komponentti (1 = H, 2 = S, 3 = L)
Function RGBtoHSL(r#, g#, b#, comp)
	r# = r / 255
	g# = g / 255
	b# = b / 255
	
	ma# = Max(Max(r, g), b)
	mi# = Min(Min(r, g), b)
	
	If ma = mi Then
		h# = 0
	ElseIf ma = r then
		h# = 60 * (0 + ((g - b) / (ma - mi)))
	ElseIf ma = g Then
		h# = 60 * (2 + ((b - r) / (ma - mi)))
	ElseIf ma = b Then
		h# = 60 * (4 + ((r - g) / (ma - mi)))
	EndIf
	
	If h# < 0 Then
		h# = h# + 360
	EndIf
	
	l# = 0.5 * (ma + mi)
	
	If ma = mi Then
		s# = 0.0
	ElseIf l <= 0.5 Then
		s# = (ma - mi) / (2 * l)
	ElseIf l > 0.5 Then
		s# = (ma - mi) / (2 - (2 * l))
	EndIf
	
	Select comp
		Case 1
			Return h
		Case 2
			Return s * 255
		Case 3
			Return l * 255
	EndSelect
EndFunction
CoolBasic henkilökuntaa
Kehittäjä

cbFUN Kello
cbSDL
Whale.dy.fi

<@cce> miltäs tuntuu olla suomen paras
Post Reply