如何使用PHP生成更亮/更深的颜色?
例如,我有一些颜色的十六进制值。#202010
如何在PHP中生成一种更亮或更暗的新颜色,以百分比(即深20%)给出?
例如,我有一些颜色的十六进制值。#202010
如何在PHP中生成一种更亮或更暗的新颜色,以百分比(即深20%)给出?
按百分比调整颜色(如 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;
}
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);
}
下面是一个示例结果: