如何使用PHP制作颜色的较浅版本?

9

大家好。有关RGB颜色及其用途的问题,以下是一个简单小的PHP代码:

假设我有一个变量$colorA,其中包含有效的六位颜色代码,比如说B1B100,一种带绿色的自然颜色。现在,如果我想从这个颜色中制作一个新的颜色,比原来的颜色轻十个步骤(大概),那么怎么做呢?

$colorA = B1B100 // original color
php code with little color engine lightening stuff up goes here
$colorB = ?????? // original color lightened up

是否有一个php准备好的函数,可以知道rgb颜色,例如

php函数RGB(输入颜色,要做什么,输出颜色) 其中要做的事情可以是+/- 255个亮度值等等。

这种功能已经存在了吗?还是我在白日做梦?

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

如果这不存在,那么实现此功能的最短代码是什么?对我来说,建议、代码或想法都是答案。谢谢。

4
白日梦?现在已经是半夜了,伙计! - Pekka
1
你说得对!但是在荷兰这几个月里,整天都很黑暗,所以我想让我们对此保持现实一点 :) - Sam
1
@Pekka - 他显然是一个白日梦者!;-) - Drew
4个回答

4

这个Stack Overflow问题有一个完整的PHP脚本,可以将RGB转换为HSL颜色,并增加HSL颜色的H分量 - 将其改为增加L分量应该很容易。


这虽然是旧的,但这个工具在颜色处理方面非常惊人,我忍不住要提一下它:https://github.com/mikeemoo/ColorJizz-PHP - David Hobs

3
一般而言,如果您想要某种颜色的浅色调,最准确的方法是将RGB转换为HSL(或HSV),更改代表亮度的“L”(或“V”)值,然后再转换回RGB。这将保留“色相”,表示颜色在光谱上的位置,但会改变该颜色的“色调”(如果变浅)或“阴影”(如果变暗)。有关更多信息,请参见http://en.wikipedia.org/wiki/HSL_and_HSV

你可以增加数值,或者你可以将红色、绿色和蓝色同时增加相同的数量。两种方法都会产生相同的效果。 - erisco
@erisco - 它们必须按比例改变,而不是以相同的绝对量改变。 - Alnitak
1
哦,我忘了有些人不理解灰度色调主题的优越性。好发现。 - erisco

0
在这个网站上:http://www.sitepoint.com/forums/showthread.php?t=586223,他们正在讨论这段代码,它最初是由开源Drupal制作的。在PHP中似乎运行良好!?
现在,我该如何与这段代码交互,并在将HSL值输出为RGB之前更改其亮度?
<?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
只需调用 _color_rgb2hsl,取结果的第三个元素,增加它(L 必须 <= 1),然后将该数组发送到 _color_hsl2rgb。那个函数的结果就是你想要的。如果你使用 #rrggbb 值,请也使用 _color_unpack_color_pack 函数。 - Alnitak

0

PHP确实有一些图像操作库。要么是GD,要么是Imagemagick

编辑:我犯急躁了,这些库没有直接的PHP颜色操作函数 - 在看到许多它们可以通过PHP完成的图像操作后,我以为它们有某种程度的颜色操作函数。它们确实可以完成很多很酷的事情。这里有一个人的例子。


1
但是它们中没有一个能够计算出RGB颜色值的浅色。 - Pekka
谢谢你的建议+1,我访问了那些链接,但由于我不是专家/天才,我无法找到自己的方向...我猜那些更适合图像处理,对于我这个只有轻微色彩幻想的人来说太过复杂了...无论如何,我猜我对PHP有着过于丰富多彩/艺术化的期望,因为我读到了手头的RGB解决方案... - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接