Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Quelques applications utilisant TSL et TSV Mer 11 Mai 2022 - 12:50 | |
| Bonjour à tous ! Suite aux articles traitant de la colorimétrie avec les valeurs TSL et TSV que vous retrouverez en suivant ces liens, RVB vers TSL : https://panoramic.1fr1.net/t6749-colorimetrie-convertisseur-rvb-vers-tslTSL vers RVB : https://panoramic.1fr1.net/t6755-colorimetrie-convertisseur-tsl-vers-rvbRVB vers TSV : https://panoramic.1fr1.net/t6754-colorimetrie-convertisseur-rvb-vers-tsv TSV vers RVB : https://panoramic.1fr1.net/t6756-colorimetrie-convertisseur-tsv-vers-rvbje vous propose ci-dessous quelques applications. TSL : créer une barre de couleurs. - Code:
-
' TSL : Barre de couleurs ' Marc - Mai 2022 ' Ecrit en langage Panoramic
dim r%,v%,b%,i% dim teinte,saturation,luminosite
picture 1 width 1,360 height 1,30 top 1,50 left 1,110 2d_target_is 1
teinte = 0 :' [0,359] saturation = 100 :' [0,100%] luminosite = 50 :' [0,100%]
for i% = 0 to 359 tsl2rvb(i%,saturation,luminosite) 2d_pen_color r%,v%,b% 2d_line i%,0,i%,30 next i%
end ' ------------------------------------------------------------------------------ sub tsl2rvb(t1,s1,l1) dim_local var1,var2
t1 = t1 / 360 s1 = s1 / 100 l1 = l1 / 100 if s1 = 0 r% = int(l1*255) v% = int(l1*255) b% = int(l1*255) else if (l1 < 0.5) var2 = l1 * (1 + s1) else var2 = (l1 + s1) - (s1 * l1) end_if var1 = 2 * l1 - var2
r% = 255 * teinteRVB(var1,var2,t1 + (1/3)) v% = 255 * teinteRVB(var1,var2,t1 ) b% = 255 * teinteRVB(var1,var2,t1 - (1/3)) end_If end_sub ' ------------------------------------------------------------------------------ fnc teinteRVB(v1,v2,vH) if vH < 0 then vH = vH + 1 if vH > 1 then vH = vH - 1 if 6 * vH < 1 then result (v1 + (v2 - v1) * 6 * vH) : exit_fnc if 2 * vH < 1 then result (v2 ) : exit_fnc if 3 * vH < 2 then result (v1 + (v2 - v1) * ((2/3) - vH) * 6) : exit_fnc result v1 end_fnc ' ------------------------------------------------------------------------------
TSV : idem que ci-dessus, créer une barre de couleurs. - Code:
-
' TSV : barre de couleurs ' Marc - Mai 2022 ' Ecrit en langage Panoramic
dim r%,v%,b%,i% dim teinte,saturation,valeur
picture 1 width 1,360 height 1,30 top 1,50 left 1,110 2d_target_is 1
teinte = 0 :' [0,359] saturation = 100 :' [0,100] valeur = 100 :' [0,100]
for i% = 0 to 359 calculRVB(i%,saturation,valeur) 2d_pen_color r%,v%,b% 2d_line i%,0,i%,30 next i%
end ' ------------------------------------------------------------------------------ sub calculRVB(t1,s1,v1) dim_local i%, f, p, q, t, rg, vt, bl
s1 = s1 / 100 v1 = v1 / 100 If s1 = 0 rg = v1 v1 = v1 bl = v1 else if t1 = 360 t1 = 0 else t1 = t1 / 60 end_if i% = int(t1) f = t1 - i% p = v1 * (1 - s1) q = v1 * (1 - (s1 * f)) t = v1 * (1 - (s1 * (1 - f))) rg = v1 vt = p bl = q select i% case 0 rg = V1 vt = t bl = p case 1 rg = q vt = V1 bl = p case 2 rg = p vt = V1 bl = t case 3 rg = p vt = q bl = V1 case 4 rg = t vt = p bl = V1 end_select end_if r% = int(rg * 255) v% = int(vt * 255) b% = int(bl * 255) end_sub
Petit utilitaire de comparaison TSL vs TSV. Les calculs et l'affichage prennent un certain temps… Cela crée une latence sur les mouvements des curseurs de réglage. - Code:
-
' TSL / TSV : démonstration ' Barre de teintes + réglages saturation et luminosité/valeur ' Marc - Mai 2022 ' Ecrit en langage Panoramic
dim r%,v%,b%,i%,null%,xSouris% dim teinteTSL,saturationTSL,luminositeTSL dim teinteTSV,saturationTSV,valeurTSV
label reglagesaturationTSL, reglageluminositeTSL label reglagesaturationTSV, reglagevaleurTSV
interfaceUtilisateur()
end ' ------------------------------------------------------------------------------ sub interfaceUtilisateur() width 0,width(0) - width_client(0) + 500 height 0,height(0) - height_client(0) + 500 left 0,(screen_x - width(0)) / 2 top 0,(screen_y - height(0)) / 2 color 0,255,255,255 caption 0,"PANORAMIC Démonstration TSL / TSV"
' PICTURE non visible servant de planche à dessins create_hide picture 1 create_show ' zones mémoire pour stocker les dessins image 2 image 3
' dessiner modèle potentiometres dessinerModelePotentiometre()
' creer module interface TSL moduleTSL() ' creer module interface TSV moduleTSV() ' préréglage des valeurs de départ prereglages() end_sub ' ------------------------------------------------------------------------------ sub dessinerModelePotentiometre() 2d_target_is 1
' dessiner le décor de fond du potentiomètre width 1,108 height 1,44 color 1,255,255,255 2d_pen_color 153,153,153 2d_rectangle 0,21,108,23 ' copie du dessin effectué (décor de fond) en mémoire dans l'objet IMAGE 2 2d_image_copy 2,0,0,108,44
' dessiner le bouton du potentiomètre color 1,0,0,0 :' effacer planche à dessin (picture 1) 2d_pen_color 0,120,215 2d_fill_color 0,120,215 2d_rectangle 0,21,107,23 2d_rectangle 101,11,107,33 2d_line 102,10,106,10 2d_line 100,12,100,32 2d_line 107,12,107,32 2d_line 102,33,106,33
' copie du dessin effectué (bouton) en mémoire dans l'objet IMAGE 3 2d_image_copy 3,0,0,108,44 end_sub ' ------------------------------------------------------------------------------ sub creerPotentiometre(n%,x%,y%) ' Corps du potentiomètre scene2d n% top n%,y% left n%,x% width n%,108 height n%,44 sprite_target_is n%
sprite_create_hide
' creer sprite servant d'image de fond et copier le dessin dessus sprite n% sprite_image_load n%,2 sprite_position n%,0,0 ' creer le sprite du bouton et copier le dessin dessus sprite n%+1 sprite_image_load n%+1,3 sprite_position n%+1,-100,0
sprite_show n% sprite_show n%+1 end_sub ' ------------------------------------------------------------------------------ sub moduleTSL() container 20 top 20,20 left 20,20 height 20,220 width 20,460 color 20,255,255,255 caption 20," TSL " command_target_is 20 creerPotentiometre(35,175,100) :' Saturation creerPotentiometre(40,175,150) :' Luminosité
' zone test rendu des couleurs picture 4 width 4,360 height 4,30 top 4,50 left 4,50 2d_target_is 4
' légendes alpha 10 top 10,35 left 10,50 caption 10,"0°" alpha 11 top 11,35 left 11,215 caption 11,"teinte" alpha 12 top 12,35 left 12,400 caption 12,"359°" alpha 13 top 13,115 left 13,110 caption 13,"Saturation" alpha 14 top 14,165 left 14,110 caption 14,"Luminosité" alpha 15 top 15,115 left 15,300 alpha 16 top 16,165 left 16,300 on_mouse_down 35,reglagesaturationTSL on_mouse_down 40,reglageluminositeTSL end_sub ' ------------------------------------------------------------------------------ sub moduleTSV() command_target_is 0 container 21 top 21,260 left 21,20 height 21,220 width 21,460 color 21,255,255,255 caption 21," TSV " command_target_is 21 creerPotentiometre(45,175,100) :' Saturation creerPotentiometre(50,175,150) :' Luminosité
' zone test rendu des couleurs picture 5 width 5,360 height 5,30 top 5,50 left 5,50 2d_target_is 5
' légendes alpha 22 top 22,35 left 22,50 caption 22,"0°" alpha 23 top 23,35 left 23,215 caption 23,"teinte" alpha 24 top 24,35 left 24,400 caption 24,"359°" alpha 25 top 25,115 left 25,110 caption 25,"Saturation" alpha 26 top 26,165 left 26,130 caption 26,"Valeur" alpha 27 top 27,115 left 27,300 alpha 28 top 28,165 left 28,300 on_mouse_down 45,reglagesaturationTSV on_mouse_down 50,reglagevaleurTSV end_sub ' ------------------------------------------------------------------------------ reglagesaturationTSL: off_mouse_down 35 ' inhibition bouton droit souris if mouse_right_down(35)=1 on_mouse_down 35,reglagesaturationTSL return end_if
' raffraichissement de l'état des boutons de la souris null% = mouse_left_up(35) null% = mouse_left_down(35)
2d_target_is 4 while mouse_left_up(35) = 0 :' Tant que le bouton gauche de la souris est enfoncé xSouris% = mouse_x_position(35) - 104 if xSouris% < -100 :' limite gauche sprite_x_position 36,-100 end_if if xSouris% > 0 sprite_x_position 36,0 :' limite droite end_if if xSouris% > -105 and xSouris% < 0 sprite_x_position 36,xSouris% end_if saturationTSL = sprite_x_position(36) saturationTSL = 100 + saturationTSL caption 15,str$(saturationTSL)+"%" for i% = 0 to 360 tsl2rvb(i%,saturationTSL,luminositeTSL) 2d_pen_color r%,v%,b% 2d_line i%,0,i%,30 next i% end_while on_mouse_down 35,reglagesaturationTSL return ' ------------------------------------------------------------------------------ reglageluminositeTSL: off_mouse_down 40 ' inhibition bouton droit souris if mouse_right_down(40)=1 on_mouse_down 40,reglageluminositeTSL return end_if
' raffraichissement de l'état des boutons de la souris null% = mouse_left_up(40) null% = mouse_left_down(40)
2d_target_is 4
while mouse_left_up(40) = 0 :' Tant que le bouton gauche de la souris est enfoncé xSouris% = mouse_x_position(40) - 104 if xSouris% < -100 :' limite gauche sprite_x_position 41,-100 end_if if xSouris% > 0 sprite_x_position 41,0 :' limite droite end_if if xSouris% > -100 and xSouris% < 0 sprite_x_position 41,xSouris% end_if luminositeTSL = sprite_x_position(41) luminositeTSL = luminositeTSL + 100 caption 16,str$(luminositeTSL)+"%" for i% = 0 to 360 tsl2rvb(i%,saturationTSL,luminositeTSL) 2d_pen_color r%,v%,b% 2d_line i%,0,i%,30 next i% end_while on_mouse_down 40,reglageluminositeTSL return ' ------------------------------------------------------------------------------ reglagesaturationTSV: off_mouse_down 45 ' inhibition bouton droit souris if mouse_right_down(45)=1 on_mouse_down 45,reglagesaturationTSV return end_if
' raffraichissement de l'état des boutons de la souris null% = mouse_left_up(45) null% = mouse_left_down(45)
2d_target_is 5
while mouse_left_up(45) = 0 :' Tant que le bouton gauche de la souris est enfoncé xSouris% = mouse_x_position(45) - 104 if xSouris% < -100 :' limite gauche sprite_x_position 46,-100 end_if if xSouris% > 0 sprite_x_position 46,0 :' limite droite end_if if xSouris% > -100 and xSouris% < 0 sprite_x_position 46,xSouris% end_if saturationTSV = sprite_x_position(46) saturationTSV = 100 + saturationTSV caption 27,str$(saturationTSV)+"%" for i% = 0 to 359 tsv2rvb(i%,saturationTSV,valeurTSV) 2d_pen_color r%,v%,b% 2d_line i%,0,i%,30 next i% end_while on_mouse_down 45,reglagesaturationTSV return ' ------------------------------------------------------------------------------ reglagevaleurTSV: off_mouse_down 50 ' inhibition bouton droit souris if mouse_right_down(50)=1 on_mouse_down 50,reglagevaleurTSV return end_if
' raffraichissement de l'état des boutons de la souris null% = mouse_left_up(50) null% = mouse_left_down(50)
2d_target_is 5
while mouse_left_up(50) = 0 :' Tant que le bouton gauche de la souris est enfoncé xSouris% = mouse_x_position(50) - 104 if xSouris% < -100 :' limite gauche sprite_x_position 51,-100 end_if if xSouris% > 0 sprite_x_position 51,0 :' limite droite end_if if xSouris% > -100 and xSouris% < 0 sprite_x_position 51,xSouris% end_if valeurTSV = sprite_x_position(51) valeurTSV = valeurTSV + 100 caption 28,str$(valeurTSV)+"%" for i% = 0 to 359 tsv2rvb(i%,saturationTSV,valeurTSV) 2d_pen_color r%,v%,b% 2d_line i%,0,i%,30 next i% end_while on_mouse_down 50,reglagevaleurTSV return ' ------------------------------------------------------------------------------ sub tsl2rvb(t1,s1,l1) dim_local var1,var2
t1 = t1 / 360 s1 = s1 / 100 l1 = l1 / 100 if s1 = 0 r% = int(l1*255) v% = int(l1*255) b% = int(l1*255) else if (l1 < 0.5) var2 = l1 * (1 + s1) else var2 = (l1 + s1) - (s1 * l1) end_if var1 = 2 * l1 - var2
r% = 255 * teinteTSLRVB(var1,var2,t1 + (1/3)) v% = 255 * teinteTSLRVB(var1,var2,t1 ) b% = 255 * teinteTSLRVB(var1,var2,t1 - (1/3)) end_If end_sub ' ------------------------------------------------------------------------------ fnc teinteTSLRVB(v1,v2,vH) if vH < 0 then vH = vH + 1 if vH > 1 then vH = vH - 1 if 6 * vH < 1 then result (v1 + (v2 - v1) * 6 * vH) : exit_fnc if 2 * vH < 1 then result (v2 ) : exit_fnc if 3 * vH < 2 then result (v1 + (v2 - v1) * ((2/3) - vH) * 6) : exit_fnc result v1 end_fnc ' ------------------------------------------------------------------------------ sub tsv2rvb(t1,s1,v1) dim_local i%, f, p, q, t, rg, vt, bl
s1 = s1 / 100 v1 = v1 / 100 If s1 = 0 rg = v1 vt = v1 bl = v1 else if t1 = 360 t1 = 0 else t1 = t1 / 60 end_if i% = int(t1) f = t1 - i%
p = v1 * (1 - s1) q = v1 * (1 - (s1 * f)) t = v1 * (1 - (s1 * (1 - f))) rg = v1 vt = p bl = q select i% case 0 rg = V1 vt = t bl = p case 1 rg = q vt = V1 bl = p case 2 rg = p vt = V1 bl = t case 3 rg = p vt = q bl = V1 case 4 rg = t vt = p bl = V1 end_select end_if
r% = int(rg * 255) v% = int(vt * 255) b% = int(bl * 255) end_sub ' ------------------------------------------------------------------------------ sub prereglages() teinteTSL = 0 :' [0,359] saturationTSL = 100 :' [0,100%] luminositeTSL = 50 :' [0,100%]
sprite_x_position 36,0 caption 15,"100%"
sprite_x_position 41,-50 caption 16,"50%"
2d_target_is 4 for i% = 0 to 359 tsl2rvb(i%,saturationTSL,luminositeTSL) 2d_pen_color r%,v%,b% 2d_line i%,0,i%,30 next i%
teinteTSV = 0 :' [0,359] saturationTSV = 100 :' [0,100%] valeurTSV = 100 :' [0,100%]
sprite_x_position 46,0 caption 27,"100%"
sprite_x_position 51,0 caption 28,"100%"
2d_target_is 5 for i% = 0 to 359 tsv2rvb(i%,saturationTSV,valeurTSV) 2d_pen_color r%,v%,b% 2d_line i%,0,i%,30 next i% end_sub
TLS : Obtenir des dégradés d’une teinte. - Code:
-
' Creer des degradés d'une teinte ' Marc - Mai 2022 ' écrit en langage Panoramic
dim r%,v%,b% dim t,s,l
label choixTeinte
interfaceUtilisateur()
end ' ------------------------------------------------------------------------------ sub interfaceUtilisateur() dim_local pas%, n% left 0,(screen_x - width(0))/2 top 0,(screen_y - height(0))/2 color 0,255,255,255
' dessiner la barre du choix de la teinte picture 1 width 1,360 height 1,30 top 1,50 left 1,110 2d_target_is 1 cursor_cross 1 on_click 1,choixTeinte ' colorier la barre du chois de la teinte s = 1 :' valeurs admises dans l'intervalle [0,1] l = 0.50 :' valeurs admises dans l'intervalle [0,1] n% = 0 for t = 0 to 1 step 0.002777778 TSL2RVB(t,s,l) 2d_pen_color r%,v%,b% 2d_line n%,0,n%,30 n% = n% + 1 next t
' dessiner la barre de dégradés pas% = 110 for n% = 2 to 26 picture n% left n%,pas% top n%,120 width n%,14 height n%,30 pas% = pas% + 14 next n%
' légendes alpha 30 top 30,35 left 30,110 caption 30,"Cliquez sur une teinte pour obtenir des dégradés" end_sub ' ------------------------------------------------------------------------------ sub creerDegrade() dim_local pas, n% RVB2TSL(r%,v%,b%) pas = 0 for n% = 2 to 26 TSL2RVB(t,s,pas) color n%,r%,v%,b% pas = pas + 0.04 next n% end_sub ' ------------------------------------------------------------------------------ sub RVB2TSL(r1,v1,b1) dim_local mini, maxi, ecart
' conversion rvb dans l'intervalle [0,1] r1 = r1 / 255 v1 = v1 / 255 b1 = b1 / 255
' recherche de la plus grande valeur parmi les composantes r,v,b maxi = max(r1,max(v1,b1))
' recherche de la plus petite valeur parmi les composantes r,v,b mini = min(r1,min(v1,b1))
' calcul luminance l l = (maxi + mini) / 2
' calcul de l'écart entre la valeur mini et maxi ecart = maxi - mini
' si ecart est nul alors t et s sont nuls if ecart = 0 t = 0 s = 0 else ' calcul de la saturation s if l < 0.5 then s = ecart / (maxi + mini) if l >= 0.5 then s = ecart / (2 - maxi - mini )
' calcul de la teinte t if r1 = maxi then t = ( v1 - b1 ) / ecart if v1 = maxi then t = 2 + ((b1 - r1) / ecart) if b1 = maxi then t = 4 + ((r1 - v1) / ecart) end_if
' conversion de la teinte dans l'interval [0,1] t = t / 6 end_sub ' ------------------------------------------------------------------------------ sub TSL2RVB(t1,s1,l1) dim_local var1,var2
If s1 = 0 r% = int(l1*255) v% = int(l1*255) b% = int(l1*255) else if (l1 < 0.5) var2 = l1 * (1 + s1) else var2 = (l1 + s1) - (s1 * l1) end_if var1 = 2 * l1 - var2
r% = 255 * teinteRVB(var1,var2,t1 + (1 / 3)) v% = 255 * teinteRVB(var1,var2,t1 ) b% = 255 * teinteRVB(var1,var2,t1 - (1 / 3)) end_If end_sub ' ------------------------------------------------------------------------------ fnc teinteRVB(v1,v2,vT) if vT < 0 then vT = vT + 1 if vT > 1 then vT = vT - 1 if 6 * vT < 1 then result (v1 + (v2 - v1) * 6 * vT) : exit_fnc if 2 * vT < 1 then result (v2 ) : exit_fnc if 3 * vT < 2 then result (v1 + (v2 - v1) * ((2 / 3) - vT) * 6) : exit_fnc result v1 end_fnc ' ------------------------------------------------------------------------------ choixteinte: ' déterminer les valeurs RVB de la teinte cliquée r% = color_pixel_red(1,mouse_x_position(1),mouse_y_position(1)) v% = color_pixel_green(1,mouse_x_position(1),mouse_y_position(1)) b% = color_pixel_blue(1,mouse_x_position(1),mouse_y_position(1))
creerDegrade() return ' ------------------------------------------------------------------------------
Bonne journée à tous ! | |
|