9
votes

Comment faire une version plus légère d'une couleur à l'aide de PHP?

Bonjour compatriote Ethlings. Une question à propos de la couleur RVB et de son utilité dans un simple petit code PHP:

Imagine j'ai une variable $ colora code> contenant une couleur de six caractères valide. Dites b1b100 code>, une couleur naturelle verdâtre. Maintenant, si je voudrais faire une nouvelle couleur à partir de celui-ci, c'est-à-dire que dix marches plus légères que cette couleur originale, à peu près. P> xxx pré>

existe une fonction PHP Connaît les couleurs RVB quelque chose comme P>

Fonction PHP RVB (couleur d'entrée, que faire, couleur de sortie) strong> em> em> Où faire pourrait être +/- 255 valeurs de luminosité, etc. P>

est quelque chose comme ça déjà possible ou je suis un jour rêvant? P>

rgb-hsl($colorA, +10, $colorB);


3 commentaires

Jour rêver? Il est minuit, homme!


Vous avez raison! Mais ces mois, c'est sombre tout au long de la journée aux Pays-Bas, alors je pensais que nous soyons simplement réalistes à ce sujet :)


@Pekka - Il est évidemment un croyant rêveur! ;-)


4 Réponses :


3
votes

En général, si vous voulez une nuance plus légère d'une couleur particulière, le processus le plus précis est de convertir de RVB en HSL (ou HSV), de modifier la valeur «L» (ou 'V') qui représente la légèreté, puis reconvertir en RVB.

Cela préservera la "teinte", qui représente l'endroit où la couleur est assise sur le spectre, mais changera la "teinte" (si illuminaire) ou "ombre" (si assombrie) de cette couleur.

voir http://en.wikipedia.org/wiki/hsl_and_hsv Pour plus d'informations.


3 commentaires

Vous pouvez incrémenter la valeur, ou vous pouvez incrémenter le rouge, le vert et le bleu de la même quantité. Soit aura le même effet.


@erisco - ils doivent être changés en proportion , pas par le même montant absolu.


Oh, j'ai oublié que certaines personnes ne comprennent pas la supériorité des thèmes de couleur en niveaux de gris. Bonne prise.



0
votes

php a une bibliothèque de manipulation d'images de couple. gd ou imagemagick

Edit: J'ai sauté le pistolet, ces bibliothèques ne disposent pas de fonctions de manipulation de couleurs PHP directes - je suppose honnêtement qu'ils ont fait de manière à voir beaucoup de choses qu'ils peuvent faire avec des images via PHP. Ils accomplissent beaucoup de choses cool. Voici 's Exemple d'un gars.


2 commentaires

Mais aucun d'entre eux n'offre de calculer une couleur plus claire pour une valeur de couleur RVB.


Merci pour votre suggestion +1, je suis allé sur ces liens, et puisque je ne suis pas un expert / génie, je ne pouvais pas trouver mon chemin là-bas ... je suppose que ce sont plus pour la manipulation d'image et trop complexes pour ma petite lumière Colorish Taydreaming ... Toilewayz Je suppose que j'avais des attentes trop colorées / artistiques sur PHP ayant des solutions RVB à la main ...



4
votes

Cette question à la question a une complète Script PHP soufflé capable de convertir une couleur RVB en une couleur HSL et d'augmenter son composant h d'une couleur HSL - elle doit être triviale pour pouvoir augmenter la place.


1 commentaires

C'est vieux, mais cet outil est tellement étonnant pour la manipulation des couleurs que je ne pouvais pas m'empêcher de le mentionner: Github .com / mikeemoo / colorjizz-php



0
votes

sur ce site web: http://www.sitepoint.com/forums/ showthread.php? t = 586223 Ils parlent de ce code qui est initialement fabriqué par OpenSource Drupal. Semble fonctionner correctement dans PHP!?

Maintenant, comment puis-je me moquer de ce code et modifier la légèreté d'une valeur HSL, avant que celle émise par RVB? P>

<?php
### RGB >> HSL
function _color_rgb2hsl($rgb) {
  $r = $rgb[0]; $g = $rgb[1]; $b = $rgb[2];
  $min = min($r, min($g, $b)); $max = max($r, max($g, $b));
  $delta = $max - $min; $l = ($min + $max) / 2; $s = 0;
  if ($l > 0 && $l < 1) {
    $s = $delta / ($l < 0.5 ? (2 * $l) : (2 - 2 * $l));
  }
  $h = 0;
  if ($delta > 0) {
    if ($max == $r && $max != $g) $h += ($g - $b) / $delta;
    if ($max == $g && $max != $b) $h += (2 + ($b - $r) / $delta);
    if ($max == $b && $max != $r) $h += (4 + ($r - $g) / $delta);
    $h /= 6;
  } return array($h, $s, $l);
}

### HSL >> RGB
function _color_hsl2rgb($hsl) {
  $h = $hsl[0]; $s = $hsl[1]; $l = $hsl[2];
  $m2 = ($l <= 0.5) ? $l * ($s + 1) : $l + $s - $l*$s;
  $m1 = $l * 2 - $m2;
  return array(_color_hue2rgb($m1, $m2, $h + 0.33333),
               _color_hue2rgb($m1, $m2, $h),
               _color_hue2rgb($m1, $m2, $h - 0.33333));
}

### Helper function for _color_hsl2rgb().
function _color_hue2rgb($m1, $m2, $h) {
  $h = ($h < 0) ? $h + 1 : (($h > 1) ? $h - 1 : $h);
  if ($h * 6 < 1) return $m1 + ($m2 - $m1) * $h * 6;
  if ($h * 2 < 1) return $m2;
  if ($h * 3 < 2) return $m1 + ($m2 - $m1) * (0.66666 - $h) * 6;
  return $m1;
}

### Convert a hex color into an RGB triplet.
function _color_unpack($hex, $normalize = false) {
  if (strlen($hex) == 4) {
    $hex = $hex[1] . $hex[1] . $hex[2] . $hex[2] . $hex[3] . $hex[3];
  } $c = hexdec($hex);
  for ($i = 16; $i >= 0; $i -= 8) {
    $out[] = (($c >> $i) & 0xFF) / ($normalize ? 255 : 1);
  } return $out;
}

### Convert an RGB triplet to a hex color.
function _color_pack($rgb, $normalize = false) {
  foreach ($rgb as $k => $v) {
    $out |= (($v * ($normalize ? 255 : 1)) << (16 - $k * 8));
  }return '#'. str_pad(dechex($out), 6, 0, STR_PAD_LEFT);
}

/* $testrgb = array(0.2,0.75,0.4); //RGB to start with
print_r($testrgb); */
      print "Hex: ";

  $testhex = "#b7b700";
      print $testhex;

  $testhex2rgb = _color_unpack($testhex,true); 
      print "<br />RGB: ";

  var_dump($testhex2rgb);
      print "<br />HSL color module: ";

  $testrgb2hsl = _color_rgb2hsl($testhex2rgb); //Converteren naar HSL

  var_dump($testrgb2hsl);
      print "<br />RGB: ";

  $testhsl2rgb = _color_hsl2rgb($testrgb2hsl); // En weer terug naar RGB    
  var_dump($testhsl2rgb); 
      print "<br />Hex: ";

  $testrgb2hex = _color_pack($testhsl2rgb,true);
  var_dump($testrgb2hex);

?>


1 commentaires

Il suffit d'appeler _color_rgb2hsl , prenez le troisième élément du résultat, augmentez-le (l doit être <= 1), puis envoyez ce tableau dans _color_hsl2rgb . Le résultat de que est ce que vous voulez. Utilisez le _Color_unpack et _Color_pack fonctionne également si vous utilisez des valeurs #RRGGBBB.