PHP - Eclaircir une couleur

PHP - Eclaircir une couleur - PHP - Programmation

Marsh Posté le 29-09-2017 à 11:38:33    

Bonjour,
 
J'ai une valeur de couleur en hexa et je voudrais à partir de celle-ci, en obtenir une valeur plus claire.
J'ai essayé en convertissant en décimal, en faisant une addition, puis en revenant en hexa mais le souci c'est que mon addition dépasse parfois FFFFFF, et donc ça n'est pas bon.
Mettre un "if(ma_valeur > FFFFFF) -> ma_valeur=FFFFFF" ne me va pas non plus car je ne veut pas de blanc.
 
Exemple avec cette couleur orange: f57c00 pour laquelle une addition de 222222 n'est pas bonne, alors qu'on voit bien qu'on peut facilement avoir plus clair dans un logiciel de dessin.
 
Bref, si vous avez la solution... Merci! :)

Reply

Marsh Posté le 29-09-2017 à 11:38:33   

Reply

Marsh Posté le 29-09-2017 à 11:47:31    

Passe ta couleur en mode HSL , et joue sur la luminance ( le L )


---------------

Reply

Marsh Posté le 29-09-2017 à 14:37:32    

Tiens, j'avais même pas pensé à ça.
... Ne reste plus qu'à trouver un bout de script qui fait ça, les 2 que j'ai testé pour le moment me renvoient des valeurs... fantaisistes dirons-nous... ;)

Reply

Marsh Posté le 29-09-2017 à 16:04:13    

Tu découpes en R,V,B, tu fais trois additions séparées avec test dépassement et tu recolles les bouts?  
 
Attention le code c'est du Perl, je ne maîtrise pas le PHP, mais ça doit être plus ou moins proche:

Code :
  1. #sans garantie et toussa...
  2. use strict;
  3. use warnings FATAL=>'all';
  4.  
  5. my $color="f57c00";
  6.  
  7. my $increment=0x22;
  8.  
  9. my @rgb=unpack("(A[2])*", $color);
  10.  
  11. foreach (@rgb) #attention $_ est une espèce de pointeur, en modifiant $_ on modifie donc bien le contenu du tableau
  12. {
  13.     $_=hex($_)+$increment;
  14.     $_=0xFF if($_>0xFF);
  15. }
  16.  
  17. my $color_new=join('', map({sprintf("%02x", $_)} @rgb));
  18.  
  19. print "$color -> $color_new\n";

Reply

Marsh Posté le 02-10-2017 à 10:50:50    

Salut,
 
C'est ce que j'avais fait à la base mais ça ne marche pas avec certaines couleurs comme du orange un peu pétant par exemple.
Le fait d'ajouter "222222" à la couleur fait qu'il y a systématiquement dépassement, et je me retrouve avec du "FFFFFF" au final, et le blanc je n'en veux pas. :)
 
Pour info, une petite fonction PHP qui fait bien le boulot du RVB vers HSL, qui nous permet ensuite d'éclaircir plus facilement:
 

Code :
  1. <?
  2. function rgbToHsl( $r, $g, $b ) {
  3. $oldR = $r;
  4. $oldG = $g;
  5. $oldB = $b;
  6. $r /= 255;
  7. $g /= 255;
  8. $b /= 255;
  9.     $max = max( $r, $g, $b );
  10. $min = min( $r, $g, $b );
  11. $h;
  12. $s;
  13. $l = ( $max + $min ) / 2;
  14. $d = $max - $min;
  15.      if( $d == 0 ){
  16.          $h = $s = 0; // achromatic
  17.      } else {
  18.          $s = $d / ( 1 - abs( 2 * $l - 1 ) );
  19.  switch( $max ){
  20.             case $r:
  21.              $h = 60 * fmod( ( ( $g - $b ) / $d ), 6 );
  22.                         if ($b > $g) {
  23.                     $h += 360;
  24.                 }
  25.                 break;
  26.             case $g:
  27.              $h = 60 * ( ( $b - $r ) / $d + 2 );
  28.              break;
  29.             case $b:
  30.              $h = 60 * ( ( $r - $g ) / $d + 4 );
  31.              break;
  32.         }                   
  33. }
  34.       return array( round( $h, 2 ), round( $s, 2 ), round( $l, 2 ) );
  35.     }


 
Et les formules qui vont bien:
http://www.rapidtables.com/convert [...] to-hsl.htm

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed