PHP实现RGB,HSL,HSV色彩空间转换

这篇博客介绍了如何使用PHP实现RGB、HSL和HSV色彩空间之间的转换。通过定义HSL、HSV和RGB类,实现了色彩的相互转换,并提供了测试用例确保转换的准确性。
摘要由CSDN通过智能技术生成
<?php

/**
 * HSL色彩空间描述
 * @author shizhuolin
 */
class HSL {

    /**
     * 色相 0-360
     * @var float 
     */
    protected $_hue;

    /**
     * 饱和度 0-1
     * @var float 
     */
    protected $_saturation;

    /**
     * 亮度 0-1
     * @var float 
     */
    protected $_lightness;

    /**
     * 构造HSL色彩空间描述
     * @param float $hue
     * @param float $saturation
     * @param float $lightness 
     */
    public function __construct($hue=0, $saturation=0, $lightness=0) {
        $this->_hue = $hue;
        $this->_saturation = $saturation;
        $this->_lightness = $lightness;
    }

    /**
     * 获取色相
     * @return float 
     */
    public function getHue() {
        return $this->_hue;
    }

    /**
     * 获取饱和度
     * @return float 
     */
    public function getSaturation() {
        return $this->_saturation;
    }

    /**
     * 获取亮度
     * @return float 
     */
    public function getLightness() {
        return $this->_lightness;
    }

    /**
     * 获取RGB形式色彩空间描述
     * @return RGB 
     */
    public function toRGB() {
        $h = $this->getHue();
        $s = $this->getSaturation();
        $l = $this->getLightness();

        if ($s == 0) {
            require_once 'RGB.php';
            return new RGB($l, $l, $l);
        }

        $q = $l < 0.5 ? $l * (1 + $s) : $l + $s - ($l * $s);
        $p = 2 * $l - $q;
        $hk = $h / 360;
        $tR = $hk + (1 / 3);
        $tG = $hk;
        $tB = $hk - (1 / 3);

        $tR = $this->getTC($tR);
        $tG = $this->getTC($tG);
        $tB = $this->getTC($tB);
        $tR = $this->getColorC($tR, $p, $q);
        $tG = $this->getColorC($tG, $p, $q);
        $tB = $this->getColorC($tB, $p, $q);

        require_once 'RGB.php';
        return new RGB($tR, $tG, $tB);
    }

    private function getColorC($tc, $p, $q) {
        if ($tc < (1 / 6)) {
            return $p + (($q - $p) * 6 * $tc );
        } else if ((1 / 6) <= $tc && $tc < 0.5) {
            return $q;
        } else if (0.5 <= $tc && $tc < (2 / 3)) {
            return $p + (($q - $p) * 6 * (2 / 3 - $tc) );
        } else {
            return $p;
        }
    }

    private function getTC($c) {
        if ($c < 0)
            $c++;
        if ($c > 1)
            $c--;
        return $c;
    }

    /**
     * 获取 array形式HSL色彩描述
     * @return array 
     */
    public function toArray() {
        return array(
            'hue' => $this->getHue(),
            'saturation' => $this->getSaturation(),
            'lightness' => $this->getLightness()
        );
    }

}


<?php

/**
 * HSV色彩空间描述
 * @author shizhuolin
 */
class HSV {

    /**
     * 色相 0-260
     * @var float 
     */
    protected $_hue;

    /**
     * 饱和度 0-1
     * @var float 
     */
    protecte
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值