Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Tk code hexa d'une couleur à partir du nom

22 réponses
Avatar
perlgenome
Bonjour,

Pouvez vous me dire comment obtenir le code hexa =E0 partir d'un nom de
couleur en perl Tk. Existe il une m=E9thode qui pourrait me le fournir.
Par exemple, afin d'obtenir #FF0000 pour la couleur 'red' ! Comment
Perl Tk fait il pour faire la correspondance entre les noms de couleur
et le code hexa. J'en ai besoin pour mettre =E0 jour mon code dans mes
modules.

Merci.

10 réponses

1 2 3
Avatar
Paul Gaborit
À (at) Sun, 6 Jun 2010 14:43:40 -0700 (PDT),
perlgenome écrivait (wrote):

Pouvez vous me dire comment obtenir le code hexa à partir d'un nom de
couleur en perl Tk. Existe il une méthode qui pourrait me le fournir.
Par exemple, afin d'obtenir #FF0000 pour la couleur 'red' ! Comment
Perl Tk fait il pour faire la correspondance entre les noms de couleur
et le code hexa. J'en ai besoin pour mettre à jour mon code dans mes
modules.



Tous les widget proposent la méthode 'rgb' qui prend comme argument une
couleur et qui retourne la liste de 3 valeurs *décimales* pour ses
composantes rouge, vert, bleu. Pour en savoir plus :

perldoc Tk::Widget

Ensuite, 'sprintf' peut faire la conversion hexa :

my ($r, $v, $b) = $widget->rgb('red');
my $hexcol = sprintf("#%02x%02x%02x", $r, $v, $b);

Ou, en factorisant :

my $hexcol = sprintf("#%02x%02x%02x", $widget->rgb('red'));

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
perlgenome
On 7 juin, 00:11, Paul Gaborit wrote:
À (at) Sun, 6 Jun 2010 14:43:40 -0700 (PDT),
perlgenome écrivait (wrote):

> Pouvez vous me dire comment obtenir le code hexa à partir d'un nom de
> couleur en perl Tk. Existe il une méthode qui pourrait me le fournir.
> Par exemple, afin d'obtenir #FF0000 pour la couleur 'red' ! Comment
> Perl Tk fait il pour faire la correspondance entre les noms de couleur
> et le code hexa. J'en ai besoin pour mettre à jour mon code dans mes
> modules.

Tous les widget proposent la méthode 'rgb' qui prend comme argument une
couleur et qui retourne la liste de 3 valeurs *décimales* pour ses
composantes rouge, vert, bleu. Pour en savoir plus :

       perldoc Tk::Widget

Ensuite, 'sprintf' peut faire la conversion hexa :

   my ($r, $v, $b) = $widget->rgb('red');
   my $hexcol = sprintf("#%02x%02x%02x", $r, $v, $b);

Ou, en factorisant :

   my $hexcol = sprintf("#%02x%02x%02x", $widget->rgb('red'));

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>



Merci Paul, je suis bête, j'ai lu plusieurs fois cette doc sans y
faire attention. Merci.
Avatar
perlgenome
Autre question car j'ai un petit souci.
Je viens de constater que la méthode rgb pour red me retourne :
65535,0,0 au lieu de 255,0,0.
Ce qui veut dire que perl m'a retourné un code 16 bits de ce que j'ai
compris. donc mon calcul du code hexa est donc fossé.

Comment je fais pour savoir si ma machine est en 8 ou 16 bits pour les
couleurs ?
Et une fois trouvé, comment je passe le code rgb de 16 bits en 8 bits
si nécessaire.

Merci.
Avatar
Paul Gaborit
À (at) Sun, 6 Jun 2010 16:18:17 -0700 (PDT),
perlgenome écrivait (wrote):

Autre question car j'ai un petit souci.
Je viens de constater que la méthode rgb pour red me retourne :
65535,0,0 au lieu de 255,0,0.



Ah oui. Je n'avais jamais remarqué.

Ce qui veut dire que perl m'a retourné un code 16 bits de ce que j'ai
compris. donc mon calcul du code hexa est donc fossé.

Comment je fais pour savoir si ma machine est en 8 ou 16 bits pour les
couleurs ?



Aucun rapport avec la machine. C'est Tk qui manipule des couleurs sur 48
bits (3x16bits).

Et une fois trouvé, comment je passe le code rgb de 16 bits en 8 bits
si nécessaire.



Il suffit de tout diviser par 256 :

my $hexcol = sprintf("#%02x%02x%02x", map {$_/256} $top->rgb('gray50'));

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
perlgenome
On 7 juin, 01:32, Paul Gaborit wrote:
À (at) Sun, 6 Jun 2010 16:18:17 -0700 (PDT),
perlgenome écrivait (wrote):

> Autre question car j'ai un petit souci.
> Je viens de constater que la méthode rgb pour red me retourne :
> 65535,0,0 au lieu de 255,0,0.

Ah oui. Je n'avais jamais remarqué.

> Ce qui veut dire que perl m'a retourné un code 16 bits de ce que j'ai
> compris. donc mon calcul du code hexa est donc fossé.

> Comment je fais pour savoir si ma machine est en 8 ou 16 bits pour les
> couleurs ?

Aucun rapport avec la machine. C'est Tk qui manipule des couleurs sur 48
bits (3x16bits).

> Et une fois trouvé, comment je passe le code rgb de 16 bits en 8 bits
> si nécessaire.

Il suffit de tout diviser par 256 :

 my $hexcol = sprintf("#%02x%02x%02x", map {$_/256} $top->rgb('gray50 '));

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>



Merci Paul. Toujours aussi efficace.
Avatar
Paul Gaborit
À (at) Sun, 6 Jun 2010 23:31:37 -0700 (PDT),
perlgenome écrivait (wrote):

On 7 juin, 01:32, Paul Gaborit wrote:

Il suffit de tout diviser par 256 :

 my $hexcol = sprintf("#%02x%02x%02x", map {$_/256} $top->rgb('gray50'));




Merci Paul. Toujours aussi efficace.



Au passage, la formule que Tk utilise pour convertir les codes hexa sur
trois lettres est fausse :

use Tk;
my $top = new MainWindow;
foreach my $col (qw/white #fff #ffffff black #000 #000000/) {
my $hexcol = sprintf("#%02x%02x%02x", map {$_/256} $top->rgb($col));
print "$col ($hexcol): ", join(', ', $top->rgb($col)), "n";
}

La couleur #fff devrait être du blanc. Tk la transforme en #f0f0f0 alors
que ça devrait être #ffffff.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
perlgenome
On 7 juin, 08:55, Paul Gaborit wrote:
À (at) Sun, 6 Jun 2010 23:31:37 -0700 (PDT),
perlgenome écrivait (wrote):

> On 7 juin, 01:32, Paul Gaborit wrote:

>> Il suffit de tout diviser par 256 :

>>  my $hexcol = sprintf("#%02x%02x%02x", map {$_/256} $top->rgb('gra y50'));

> Merci Paul. Toujours aussi efficace.

Au passage, la formule que Tk utilise pour convertir les codes hexa sur
trois lettres est fausse :

  use Tk;
  my $top = new MainWindow;
  foreach my $col (qw/white #fff #ffffff black #000 #000000/) {
    my $hexcol = sprintf("#%02x%02x%02x", map {$_/256} $top->rgb($c ol));
    print "$col ($hexcol): ", join(', ', $top->rgb($col)), "n";
  }

La couleur #fff devrait être du blanc. Tk la transforme en #f0f0f0 alor s
que ça devrait être #ffffff.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>



Merci pour la remarque.
En fait, j'en avais besoin pour mettre à jour mon module
Tk::Canvas::GradientColor. Je vais pouvoir à présent pouvoir
récupérer le nom de couleur également dans mes méthodes.
Sinon, étant donné votre remarque. Je pense que je vais faire une
vérification du code couleur qui sera donné. Si c'est un code hexa, je
vérifieri qu'il contient un dièse suivi de 6 caractères.
if ( $HexColor =~ m{^#(?:[0-9A-Z]{2}){3}$}i ) { .. }. Ça m'évitera
d'avoir de mauvaise surprise, à moins que vous ayez une meilleure
idée.

Merci
Avatar
Paul Gaborit
À (at) Mon, 7 Jun 2010 00:22:43 -0700 (PDT),
perlgenome écrivait (wrote):

Sinon, étant donné votre remarque. Je pense que je vais faire une
vérification du code couleur qui sera donné. Si c'est un code hexa, je
vérifieri qu'il contient un dièse suivi de 6 caractères.
if ( $HexColor =~ m{^#(?:[0-9A-Z]{2}){3}$}i ) { .. }. Ça m'évitera
d'avoir de mauvaise surprise, à moins que vous ayez une meilleure
idée.



Plutôt que les rejeter, on peut convertir les valeurs hexa sur trois
lettres : le plus simple consiste tout simplement à doubler chaque
chiffre.

#f8d devient #ff88dd
#fff devient #ffffff
#000 devient #000000

Un truc du genre devrait faire l'affaire :

$HexColor =~ s/^#([0-9A-Z])([0-9A-Z])([0-9A-Z])$/#$1$1$2$2$3$3/i
if $HexColor =~ m/^#[0-9A-Z]{3}$/i;

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
perlgenome
On 7 juin, 11:11, Olivier Miakinen <om+ wrote:
Bonjour,

Le 07/06/2010 01:32, Paul Gaborit a écrit :



>> Et une fois trouvé, comment je passe le code rgb de 16 bits en 8 bit s
>> si nécessaire.

> Il suffit de tout diviser par 256 :

>  my $hexcol = sprintf("#%02x%02x%02x", map {$_/256} $top->rgb('gray 50'));

En fait, pour obtenir la valeur d'un code en 8 bits à partir d'un code
en 16 bits, diviser par 257 devrait donner un résultat plus proche de l a
bonne valeur s'il s'agit de division réelle. Mais bien sûr, si c'est une
division entière, ou si le résultat est tronqué au lieu d'être ar rondi,
diviser par 256 donnera le même résultat.

En décimal :
  65535 ÷ 256 = 255,99609375
  65535 ÷ 257 = 255

En hexadécimal :
  FFFF ÷ 100 = FF,FF
  FFFF ÷ 101 = FF

Cordialement,
--
Olivier Miakinen



J'ai opté pour ceci my $hexcol = sprintf("#%02x%02x%02x", map { int($_/
256) } $top->rgb('gray50')); en utilisant int.

Sinon y a t il un moyen de passer d'un code 3 digits à 6 digit :
Exemple :
FFF 255 255 255 #FFFFFF
FFC 255 255 204 #FFFFCC
FF9 255 255 153 #FFFF99

Voici un lien récapitulatif : http://www.seoconsultants.com/css/colors/we b/safe/

Ainsi, il suffirait de tester via une regex s'il n'y a que 3
caractères et le passer en 6, mais je ne trouve pas la logique pour
passer de #FFC à #FFFFCC par exemple.

Merci
Avatar
Paul Gaborit
À (at) Mon, 07 Jun 2010 11:11:35 +0200,
Olivier Miakinen <om+ écrivait (wrote):

En fait, pour obtenir la valeur d'un code en 8 bits à partir d'un code
en 16 bits, diviser par 257 devrait donner un résultat plus proche de la
bonne valeur s'il s'agit de division réelle. Mais bien sûr, si c'est une
division entière, ou si le résultat est tronqué au lieu d'être arrondi,
diviser par 256 donnera le même résultat.



Tu as tout à fait raison et, heureusement pour ma solution qui divise
par 256, il semble que 'sprintf' tronque au lieu d'arrondir (pour les
entiers).

Dans l'autre sens, c'est encore plus vrai :
- Pour passer de 4 bits à 8 bits, il faut multiplier par 17 (d'où
l'astuce de doubler les chiffres hexa pour passer de #fff à #ffffff).
- Pour passer de 8 bits à 16 bits, il faut multiplier par 257.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
1 2 3