webzille/colorutility

V1.6 2024-05-26 21:20 UTC

This package is auto-updated.

Last update: 2024-09-28 19:42:11 UTC


README

Webzille 颜色工具是一个全面的 PHP 包,用于跨多个颜色模型的高级颜色操作,包括圆柱形LAB、HEX、HSL、HSLA、HSV、LAB、RGB、RGBA和RYB。这个强大的工具允许开发者使用直观灵活的API对颜色执行各种操作,如转换、计算和转换。

功能

  • 多种颜色模型:使用各种颜色模型来满足不同的图形和应用需求。
  • 颜色操作:轻松操作颜色属性,包括调整、混合和转换。
  • 颜色比较:比较颜色以找到差异、距离和相似之处,既可通过视觉比较,也可通过计算指标。
  • 高级计算:计算角度、距离和偏差以更好地理解颜色关系。
  • 颜色和谐:根据互补、类似、三原色等和谐规则生成颜色方案。
  • 随机颜色生成:在RGB颜色模型中生成随机颜色,并可选择使用种子返回原始颜色。

安装

要在项目中使用 Webzille 颜色工具,请通过 Composer 包含它

composer require webzille/colorutility

颜色空间/轮盘

本包包括以下颜色空间/轮盘,用于创建方案。

  • RYB 传统画家:这个色轮基于传统画家的视角,其中原色为红、黄、蓝。它在艺术和设计教育中被广泛使用,强调画家如何混合颜色以实现广泛的色域。这个模型非常适合需要自然主义颜色混合和和谐的应用程序,因为它与传统艺术技巧相一致。
  • HSV(色调、饱和度、亮度):HSV用色调、饱和度和亮度(亮度)来表示颜色。色调是颜色类型,饱和度表示颜色的强度,亮度表示亮度。这个模型特别适用于需要直观颜色调整的应用程序,因为它以符合人类对颜色的感知方式分离了颜色成分。
  • LAB:LAB颜色空间包括三个组件 - L代表亮度,A和B分别代表从绿色到红色和从蓝色到黄色的颜色谱。它旨在模拟人类视觉,并且不依赖于颜色如何用光或颜料创建。这个模型对于实现精确的颜色操作并确保不同设备和观看条件下的颜色一致性非常有用。

使用方法

基本用法

包含包后,您可以从任何支持的色彩空间开始创建颜色对象。

use Webzille\ColorUtility\Colors\RGB;
use Webzille\ColorUtility\Colors\RYB;
use Webzille\ColorUtility\Colors\LAB;

$rgbColor = new RGB(255, 0, 0);  // Red in RGB
$rybColor = new RYB(255, 0, 0);  // Red in RYB
$labColor = new LAB(53.23288178584245, 80.10930952982204, 67.22006831026425);  // Red in LAB

从字符串工厂设置颜色

您可以使用 SetColor::fromString(string $string) 工厂从任何网络安全颜色格式(RGBA、RGB、HSLA、HSL、HEX和命名颜色)设置颜色对象。

use Webzille\ColorUtility\SetColor;

$HexString = "#ffcc00";
$HexObject = SetColor::fromString($HexString);

$RGBString = "rgb(255, 0, 0);";
$RGBObject = SetColor::fromString($RGBString);

$RGBAString = "rgba(153, 255, 46, 0.4)";
$RGBAObject = SetColor::fromString($RGBAString);

$HSLAString = "hsla(0, 41%, 51%, 0.3)";
$HSLAObject = SetColor::fromString($HSLAString);

$HSLString = "hsl(146, 41%, 51%)";
$HSLObject = SetColor::fromString($HSLString);

$NamedString = "steelblue";
$NamedObject = SetColor::fromString($NamedString);

在颜色空间/轮盘之间转换

默认情况下,该包使用 RYB 传统画家 轮盘创建颜色方案或执行任何可用的颜色操作方法。但是,通过传递类字符串名称到 setSpace() 方法,可以轻松将颜色轮从 RYB 更改为 HSVLAB

$rgbColor = new RGB(255, 128, 69);
echo $rgbColor->setSpace(LAB::class)->findColorByAngle(180)->viewColor();  // rgb(0, 189, 255)

$rgbColor = new RGB(255, 128, 69);
echo $rgbColor->setSpace(HSV::class)->findColorByAngle(180)->viewColor();  // rgb(69, 196, 255)

// The default color space / wheel
$rgbColor = new RGB(255, 128, 69);
echo $rgbColor->setSpace(RYB::class)->findColorByAngle(180)->viewColor();  // rgb(69, 255, 122)

$rgbColor = new RGB(255, 128, 69);
echo $rgbColor->findColorByAngle(180)->viewColor();  // rgb(69, 255, 122)

您也可以简单地将颜色对象从 RGB 转换为 RYB、LAB 或 HSV 之一,而不是指定特定颜色空间。

$rgbColor = new RGB(255, 128, 69);
echo $rgbColor->as(LAB::class)->findColorByAngle(180)->viewColor();

这相当于

$rgbColor = new RGB(255, 128, 69);
echo $rgbColor->asLAB()->findColorByAngle(180)->viewColor();

如果您正在使用的颜色模型有自己的 findColorByAngle() 和类似方法,它将使用自己的此类方法,而不是 $this->colorSpace 设置的内容。例如

$labColor = new LAB(53, 80, 67);
echo $labColor->setSpace(RYB::class)->findColorByAngle(180);  // LAB(53, -80, -67) // Light-blue

在上面的示例中,尽管我设置了使用的颜色空间为 RYB::class,由于 LAB 颜色模型有自己的方法,它将使用它,从而导致它使用自己的颜色空间。要利用 RYB 颜色空间在 LAB 中操纵颜色,您需要显式地在方法之间进行转换。

$labColor = new LAB(53, 80, 67);
echo $labColor->asRYB()->findColorByAngle(180)->backTo($labColor);  // LAB(87, -86, 83) // Green
// or

echo $labColor->asRYB()->findColorByAngle(180)->asLAB();  // LAB(87, -86, 83) // Green

从字符串中捕获颜色

您可以从字符串中捕获颜色,以满足您的任何解析需求。此方法还捕获了大多数流行的命名颜色。

$value = ".cssRuleset {
    font-size: 1.3em;
    color: #ffcc00;
    border: 1px solid rgb(124, 20, 0);
    background-color: transparent;
}";

$transparency = true;
preg_match_all(Colors::getMatchingPattern($transparency), $value, $matches);

print_r($matches[1]);

// Array
// (
//     [0] => #ffcc00
//     [1] => rgb(124, 20, 0)
//     [2] => transparent
// )

如果将 $transparency 设置为 false,则它将忽略 'transparent' 颜色。

查看颜色

颜色类提供了一种查看对象所持颜色样本的方法。此方法接受一个可选的字符串参数,允许您为颜色样本添加标签,以帮助跟踪每个颜色对象。

echo $NamedString->viewColor("The optional label");

echo $RGBAObject->viewColor();

此方法检测对象是否处于 Web 安全颜色格式,并在颜色对象不是 Web 安全颜色格式(如 LAB 或 RYB)的情况下将其转换为 RGB。

操纵颜色

调整颜色属性、混合颜色或计算颜色和谐。

$complementaryRGB = $rgbColor->complementary(); // Green

$weight = 0.5;
$blendedRYB = $rybColor->blendColors(new RYB(0, 0, 255), $weight); // Blend red and blue in RYB

混合颜色目前仅在 RYB 颜色空间内完成。您可以将颜色对象转换为 RYB,混合它们,然后将结果颜色转换回您正在使用的颜色模型。权重是一个介于 0 和 1 之间的数字,用于确定颜色混合的方式。如果权重为 0,混合将只显示第一种颜色。如果权重为 1,则只显示第二种颜色。权重越接近 1,混合将越偏向第二种颜色。此方法使颜色之间的过渡更加平滑,使混合更加自然。

$darkerColor = $rgbColor->adjustShade(50); // 50% of the current shade
$brighterColor = $rgbColor->adjustShade(150); // 50% brighter than it's current shade
$sameShade - $rgbColor->adjustShade(100); // No change; 100% of it's current shade

所有颜色都可以比它们更亮,即使是完全饱和的黄色(rgb(255, 255, 0))。您可以使用相对于颜色当前亮度/阴影的百分比来调整颜色的阴影(使颜色变亮或变暗)。

分析颜色

计算角度、距离,并执行高级分析,如检查颜色是亮色还是暗色。

$isLight = $rgbColor->isLight(); // Returns true if the color is considered light
$angleBetween = $rybColor->calculateAngle(new RYB(0, 255, 0)); // Calculate angle between red and yellow in RYB

生成颜色方案

根据预定义的和谐生成颜色方案。

$triadicScheme = $rgbColor->triadic(); // Returns an array of RGB objects in a triadic scheme

随机颜色生成

您可以使用或不需要种子生成随机颜色。随机颜色工厂返回一个数组,其中第一个元素是颜色对象,第二个是用于生成该颜色对象的种子。

[$color, $seed] = SetColor::random();
echo $color->viewColor("Seed: $seed");

如果想要创建之前生成的颜色对象,随机颜色工厂接受可选的 $seed 参数。

$colorSeed = 8167421221;

[$color, $seed] = SetColor::random($colorSeed);
echo $color->viewColor("Seed: $seed");

theme.php 提供了使用随机颜色工厂和利用该包其他功能的示例。

颜色转换

Webzille 颜色工具提供了对在多种颜色模型之间进行转换的广泛支持,允许在不同颜色格式之间无缝过渡。此功能对于需要处理多个颜色规范或需要特定颜色操纵(在某些模型中更容易)的应用程序至关重要。

转换颜色

将颜色在不同模型之间进行转换以适应您应用程序的上下文。

$hexColor = $rgbColor->asHEX();
echo $hexColor; // Outputs HEX code for red

如果您需要使用需要将颜色从一种颜色模型转换为另一种颜色模型并最终需要将颜色模型转换回转换之前的颜色模型的不同颜色空间,则可以将 backTo() 方法链接到方法链的末尾。

// Default websafe color to view is RGB
$hslColor = new HSL(195.51382638999, 100, 50);
echo $hslColor->asLAB()->findColorByAngle(180)->viewColor();  // rgb(228, 163, 97)

// Making sure we view the color in HSL format after using the color in LAB color space
$hslColor = new HSL(195.51382638999, 100, 50);
echo $hslColor->asLAB()->findColorByAngle(180)->backTo($hslColor)->viewColor();  // hsl(30.533318540464, 70.332302060189%, 63.65760628305%)

如果颜色对象会动态设置且结果需要与任何转换之前相同,则这样做很好。否则,您可以简单地链接适当的转换方法以返回到原始颜色模型。

// Making sure we view the color in HSL format after using the color in LAB color space
$hslColor = new HSL(195.51382638999, 100, 50);
echo $hslColor->asLAB()->findColorByAngle(180)->asHSL()->viewColor();  // hsl(30.533318540464, 70.332302060189%, 63.65760628305%)

转换示例

以下是使用 Webzille 颜色工具在不同颜色格式之间进行转换的方法

// Assuming $rgbColor, $rybColor, and $labColor are already defined as instances of their respective color classes

// RGB to other formats
$hexFromRGB = $rgbColor->asHEX();
$hslFromRGB = $rgbColor->asHSL();
$labFromRGB = $rgbColor->asLAB();

// RYB to RGB (and then to other formats)
$rgbFromRYB = $rybColor->asRGB();
$hexFromRYB = $rybColor->asHEX();
$hslFromRYB = $rybColor->asHSL();

// LAB to RGB and to HEX
$rgbFromLAB = $labColor->asRGB();
$hexFromLAB = $labColor->asHEX();

每种颜色格式都有一个方法可以将其转换为任何其他可用格式。

致谢

RYB与RGB转换方法的原始作者为Arah J. Leonard,采用MIT许可证。以下是源代码(https://github.com/bahamas10/node-rgb2ryb/blob/master/rgb2ryb.js),我将其从JavaScript迁移到了PHP。我不知道原始代码的具体位置,但这是我找到并在这里使用的工作代码。

贡献

欢迎为Webzille颜色工具做出贡献!请确保您向开发分支提交拉取请求。

许可证

本项目采用MIT许可证 - 有关详细信息,请参阅LICENSE文件。