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.
À (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'));
À (at) Sun, 6 Jun 2010 14:43:40 -0700 (PDT),
perlgenome <genomart@gmail.com> é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/>
À (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'));
À (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'));
Merci Paul, je suis bête, j'ai lu plusieurs fois cette doc sans y faire attention. Merci.
On 7 juin, 00:11, Paul Gaborit <Paul.Gabo...@invalid.invalid> wrote:
À (at) Sun, 6 Jun 2010 14:43:40 -0700 (PDT),
perlgenome <genom...@gmail.com> é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.
À (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'));
Merci Paul, je suis bête, j'ai lu plusieurs fois cette doc sans y faire attention. Merci.
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.
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.
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.
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'));
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
On 7 juin, 08:55, Paul Gaborit <Paul.Gabo...@invalid.invalid> wrote:
À (at) Sun, 6 Jun 2010 23:31:37 -0700 (PDT),
perlgenome <genom...@gmail.com> écrivait (wrote):
> On 7 juin, 01:32, Paul Gaborit <Paul.Gabo...@invalid.invalid> 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 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
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;
À (at) Mon, 7 Jun 2010 00:22:43 -0700 (PDT),
perlgenome <genomart@gmail.com> é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/>
À (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;
>> 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.
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
On 7 juin, 11:11, Olivier Miakinen <om+n...@miakinen.net> 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.
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.
>> 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.
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
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.
À (at) Mon, 07 Jun 2010 11:11:35 +0200,
Olivier Miakinen <om+news@miakinen.net> é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/>
À (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.