如何使用 PHP 制作更轻的颜色版本?

Posted

技术标签:

【中文标题】如何使用 PHP 制作更轻的颜色版本?【英文标题】:How do I make a lighter version of a colour using PHP? 【发布时间】:2011-07-03 04:26:21 【问题描述】:

地球人你好。一个关于 RGB 颜色及其在一个简单的小 php 代码中的用处的问题:

假设我有一个变量$colorA,其中包含一个有效的六字符颜色。说B1B100,一种绿色的自然色。现在,如果我想用它制作一种新颜色,也就是说,比原来的颜色大约浅十级。

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

是否有一个知道 rgb 颜色的 php 准备函数

php函数RGB(输入颜色,做什么,输出颜色) 做什么可能是 +/- 255 亮度值等。

这样的事情已经成为可能还是我在做白日梦?

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

如果这不存在,那么最短的代码是什么?建议、代码或想法都是我的答案。谢谢。

【问题讨论】:

白日梦?午夜了,伙计! 你是对的!但是这几个月在荷兰一整天都是黑暗的,所以我认为让我们现实一点:) @Pekka - 他显然是个白日梦信徒! ;-) 【参考方案1】:

PHP 确实有几个图像处理库。 GD 或 Imagemagick

编辑:我开枪了,这些库没有直接的 PHP 颜色操作函数——老实说,在看到他们可以通过 PHP 对图像做的很多事情之后,我真的认为他们做了某种事情。他们确实完成了很多很酷的事情。 Here's 一个人的例子。

【讨论】:

但是它们都没有提供为 RGB 颜色值计算较浅的颜色。 感谢您的建议 +1,我继续使用这些链接,由于我不是专家/天才,我无法找到我的方式......我猜这些更多用于图像处理和对我的浅色白日梦来说太复杂了......无论如何,我想我对 PHP 有太多的色彩/艺术期望,有手头 rgb 解决方案......【参考方案2】:

在这个网站上: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);

?>

【讨论】:

只需调用_color_rgb2hsl,获取结果的第三个元素,增加它(L 必须 _color_hsl2rgb。 that 的结果就是你想要的。如果您使用#rrggbb 值,也可以使用_color_unpack_color_pack 函数。【参考方案3】:

This SO question 有一个成熟的 PHP 脚本,可以将 RGB 转换为 HSL 颜色,并增加 HSL 颜色的 H 分量 - 改为增加 L 应该是微不足道的。

【讨论】:

这已经很老了,但是这个工具对于颜色处理来说真是太神奇了,我忍不住提到它:github.com/mikeemoo/ColorJizz-PHP【参考方案4】:

一般来说,如果您想要特定颜色的较浅色调,最准确的过程是从 RGB 转换为 HSL(或 HSV),更改代表亮度的“L”(或“V”)值,然后转换回 RGB。

这将保留表示颜色在光谱中的位置的“色调”,但会更改该颜色的“色调”(如果变亮)或“阴影”(如果变暗)。

更多信息请参见http://en.wikipedia.org/wiki/HSL_and_HSV。

【讨论】:

您可以增加该值,或者您可以将红色、绿色和蓝色都增加相同的数量。两者都会产生相同的效果。 @erisco - 它们必须按比例进行更改,而不是相同的绝对量。 哦,我忘了有些人不了解灰度颜色主题的优越性。很好的收获。

以上是关于如何使用 PHP 制作更轻的颜色版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 websocket 优化发送绘图?

如何强制excel单元格以指数方式改变颜色?

在 PHP 中从文本创建图像 - 如何制作多行?

如何更改链接的线条/删除线颜色?

无论如何,我无法在 Hibernate 中批处理 MySQL INSERT 语句

优化 SQL Server 聚合查询