【问题标题】:Help needed with PHP function: brightness(); making RGB colors darker/brighterPHP函数需要帮助:brightness();使 RGB 颜色更暗/更亮
【发布时间】:2011-07-09 03:48:21
【问题描述】:

想象一个有效的十六进制#RGB 颜色,定义为$color = "#f7b9a0";

现在我想让 php 从这个 $color 派生出另外两种颜色,它们稍微更亮/更暗(相同的色调/颜色,但只是改变了亮度)。我可以通过哪些方式实现这一目标?什么代码会生成这个?我觉得我需要一些简单的东西,比如:

brightness(input rgb color, ± number of steps); // function outputs the new RGB
 // ?? What php code should go here??

理想情况下,我希望在我的 html 中包含这样的内容:

.classDefault {color:<?=$color?> }
.classLighter {color:<?=brightness($color,+10)?> } /* 10 steps brighter */
.classDarker  {color:<?=brightness($color,-25)?> } /* 25 steps darker   */

brightness(); 函数中应该包含哪些 PHP 代码?让我的梦想成真?
任何建议和/或代码都非常感谢!


根据以下答案更新:

function alter_brightness($colourstr, $steps) {
  $colourstr = str_replace('#','',$colourstr);
  $rhex = substr($colourstr,0,2);
  $ghex = substr($colourstr,2,2);
  $bhex = substr($colourstr,4,2);

  $r = hexdec($rhex);
  $g = hexdec($ghex);
  $b = hexdec($bhex);

  $r = max(0,min(255,$r + $steps));
  $g = max(0,min(255,$g + $steps));  
  $b = max(0,min(255,$b + $steps));

  return '#'.dechex($r).dechex($g).dechex($b);
}

### NOW LETS DEFINE MY COLOR
$color = "#2233FF";

### DERIVED BRIGHTER COLORS
$color1 = brightness($color,25);
$color2 = brightness($color,50);
$color3 = brightness($color,75);

### DERIVED DARKER COLORS
$color4 = brightness($color,-25);
$color5 = brightness($color,-50);
$color6 = brightness($color,-75);


<!-- BRIGHTER -->
<div style=" background-color:<?=$color3?>"><?=$color3?></div>
<div style=" background-color:<?=$color2?>"><?=$color2?></div>
<div style=" background-color:<?=$color1?>"><?=$color1?></div>

<!-- DEFINED CONSTANT -->
<div style=" background-color:<?=$color?>"><?=$color?></div>

<!-- DARKER -->
<div style=" background-color:<?=$color4?>"><?=$color4?></div>
<div style=" background-color:<?=$color5?>"><?=$color5?></div>
<div style=" background-color:<?=$color6?>"><?=$color6?></div>

较亮的颜色有效,但较暗的无效。哦,一半的解决方案至少是解决方案的很大一部分,所以非常感谢!

【问题讨论】:

标签: php colors hex rgb brightness


【解决方案1】:

类似的东西...

function alter_brightness($colourstr, $steps) {
  $colourstr = str_replace('#','',$colourstr);
  $rhex = substr($colourstr,0,2);
  $ghex = substr($colourstr,2,2);
  $bhex = substr($colourstr,4,2);

  $r = hexdec($rhex);
  $g = hexdec($ghex);
  $b = hexdec($bhex);

  $r = max(0,min(255,$r + $steps));
  $g = max(0,min(255,$g + $steps));  
  $b = max(0,min(255,$b + $steps));

  return '#'.dechex($r).dechex($g).dechex($b);
}

打电话给$colour = alter_brightness('#2233FF',5);

【讨论】:

  • 您的意思是使用句点而不是加号将字符串放在一起。
  • +1 非常感谢@Cusimar9 和@Kevin,当我运行代码时它说Fatal error: Call to undefined function hecdec() in /var/www/vhosts/aster.nu/httpdocs/color.php on line 148 我在代码hecdec() 和hecdex() 中看到应该在这里做什么?我非常喜欢你的最后一句话:调用函数的方式是 IU 的想法。这将是一个很好的解决方案......当它起作用时:)
  • 解决了! hexdec / decdex 在您的代码中拼写错误,但它可以很好地使颜色更亮,但是,我怎样才能让它们变暗?当我使变量“-5”或任何其他负值时,我得到不正确的 RGB 数字!查看我的更新
  • 当你说“较深”的颜色不起作用时,它实际上会给你什么结果,例如 -25?
  • 用这个替换返回行:return sprintf("#%02x%02x%02x", $r,$g,$b);
【解决方案2】:
<?php 

function alter_brightness($colourstr, $steps) {
  $colourstr = str_replace('#','',$colourstr);

  $rhex = substr($colourstr,0,2);
  $ghex = substr($colourstr,2,2);
  $bhex = substr($colourstr,4,2);

  $r = hexdec($rhex);
  $g = hexdec($ghex);
  $b = hexdec($bhex);

  $r = dechex(max(0,min(255,$r + $steps)));
  $g = dechex(max(0,min(255,$g + $steps)));  
  $b = dechex(max(0,min(255,$b + $steps)));

  $r = str_pad($r,2,"0");
  $g = str_pad($g,2,"0");
  $b = str_pad($b,2,"0");

  $cor = '#'.$r.$g.$b;

  return $cor;
}

?>

【讨论】:

【解决方案3】:

使用第二个答案。或将以下内容添加到您的代码中:

如果 rgb 值是 10 左右,它将返回单个字符的十六进制。它需要以 0 为前缀才能正确渲染。

  $newhex = '#';
  $newhex .= (strlen(dechex($r)) === 1) ?  '0'.dechex($r) : dechex($r);
  $newhex .= (strlen(dechex($g)) === 1) ?  '0'.dechex($g) : dechex($g);
  $newhex .= (strlen(dechex($b)) === 1) ?  '0'.dechex($b) : dechex($b);

  return $newhex;

【讨论】:

  • 第二个答案是哪一个?我希望你提到海报的昵称。
【解决方案4】:

Cintia 几乎是对的,但是 str_pad 应该在之前而不是之后添加一个 0:

<?php 

function alter_brightness($colourstr, $steps) {
  $colourstr = str_replace('#','',$colourstr);

  $rhex = substr($colourstr,0,2);
  $ghex = substr($colourstr,2,2);
  $bhex = substr($colourstr,4,2);

  $r = hexdec($rhex);
  $g = hexdec($ghex);
  $b = hexdec($bhex);

  $r = dechex(max(0,min(255,$r + $steps)));
  $g = dechex(max(0,min(255,$g + $steps)));  
  $b = dechex(max(0,min(255,$b + $steps)));

  $r = str_pad($r,2,"0",STR_PAD_LEFT);
  $g = str_pad($g,2,"0",STR_PAD_LEFT);
  $b = str_pad($b,2,"0",STR_PAD_LEFT);

  $cor = '#'.$r.$g.$b;

  return $cor;
}

?>

【讨论】:

    【解决方案5】:

    这是该函数的缩小版。我使用str_pad 为数字

     function alter_brightness($colourstr, $steps) {
        //Take off the #
        $colourstr    = str_replace( '#', '', $colourstr );
        // Steps should be between -255 and 255. Negative = darker, positive = lighter
        $steps  = max( -255, min( 255, $steps ) );
        // Transform colors of type #fff to #ffffff
        if ( 3 == strlen( $colourstr ) ) {
            $colourstr    = str_repeat( substr( $colourstr, 0, 1 ), 2 ) . str_repeat( substr( $colourstr, 1, 1 ), 2 ) . str_repeat( substr( $colourstr, 2, 1 ), 2 );
        }
        // Modify the brigthness of each component
        $rgb=array(substr($colourstr,0,2),  substr($colourstr,2,2), substr($colourstr,4,2));
        for($i = 0; $i< count($rgb); $i++){
          $rgb[$i] = str_pad(dechex(max(0,min(255, hexdec($rgb[$i]) + $steps))),2,"0",STR_PAD_LEFT) ;
        }
        return '#'.implode('', $rgb);
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-05
      • 2020-06-09
      • 2013-05-05
      • 2019-05-09
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      相关资源
      最近更新 更多