如何使用PHP生成更亮/更深的颜色?

2022-08-30 09:12:39

例如,我有一些颜色的十六进制值。#202010

如何在PHP中生成一种更亮或更暗的新颜色,以百分比(即深20%)给出?


答案 1

按百分比调整颜色(如 Frxstrem 给出的示例)并不理想。

如果您的颜色是黑色(RGB中的0,0,0),则将乘以零,这根本不会产生任何变化。如果您的颜色是深灰色(例如RGB中的2,2,2),则必须变亮50%才能向上移动到(3,3,3)。另一方面,如果您的RGB颜色为(100,100,100),则50%的调整将使您上升到(150,150,150),相比之下,这是一个更大的变化。

一个更好的解决方案是按步数/数字(0-255)而不是百分比进行调整,例如(PHP代码):

编辑 2014-01-06:清理了一下代码。

function adjustBrightness($hex, $steps) {
    // Steps should be between -255 and 255. Negative = darker, positive = lighter
    $steps = max(-255, min(255, $steps));

    // Normalize into a six character long hex string
    $hex = str_replace('#', '', $hex);
    if (strlen($hex) == 3) {
        $hex = str_repeat(substr($hex,0,1), 2).str_repeat(substr($hex,1,1), 2).str_repeat(substr($hex,2,1), 2);
    }

    // Split into three parts: R, G and B
    $color_parts = str_split($hex, 2);
    $return = '#';

    foreach ($color_parts as $color) {
        $color   = hexdec($color); // Convert to decimal
        $color   = max(0,min(255,$color + $steps)); // Adjust color
        $return .= str_pad(dechex($color), 2, '0', STR_PAD_LEFT); // Make two char hex code
    }

    return $return;
}

答案 2

Torkil Johnsen的答案是基于固定步骤,它不仅操纵亮度,而且还稍微改变色调。Frxstrem的方法也存在缺陷,正如Torkil Johnsen所指出的那样。

我从Github评论中采用了这种方法并改进了代码。它适用于任何情况。

/**
 * Increases or decreases the brightness of a color by a percentage of the current brightness.
 *
 * @param   string  $hexCode        Supported formats: `#FFF`, `#FFFFFF`, `FFF`, `FFFFFF`
 * @param   float   $adjustPercent  A number between -1 and 1. E.g. 0.3 = 30% lighter; -0.4 = 40% darker.
 *
 * @return  string
 *
 * @author  maliayas
 */
function adjustBrightness($hexCode, $adjustPercent) {
    $hexCode = ltrim($hexCode, '#');

    if (strlen($hexCode) == 3) {
        $hexCode = $hexCode[0] . $hexCode[0] . $hexCode[1] . $hexCode[1] . $hexCode[2] . $hexCode[2];
    }

    $hexCode = array_map('hexdec', str_split($hexCode, 2));

    foreach ($hexCode as & $color) {
        $adjustableLimit = $adjustPercent < 0 ? $color : 255 - $color;
        $adjustAmount = ceil($adjustableLimit * $adjustPercent);

        $color = str_pad(dechex($color + $adjustAmount), 2, '0', STR_PAD_LEFT);
    }

    return '#' . implode($hexCode);
}

下面是一个示例结果:

example


推荐