php method to implement color space conversion: first create a PHP sample file; then create "HSL, HSV, RGB color space"; finally implement it through "protected function tearDown(){...}" and other methods Convert.
The operating environment of this article: windows7 system, PHP7.1 version, DELL G3 computer
How does php achieve color space conversion?
PHP realizes RGB, HSL, HSV color space conversion
_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() ); } }
_hue = $hue; $this->_saturation = $saturation; $this->_value = $value; } /** * 获取色相 0-360 * @return float */ public function getHue() { return $this->_hue; } /** * 获取饱和度 0-1 * @return float */ public function getSaturation() { return $this->_saturation; } /** * 获取色调 0-1 * @return float */ public function getValue() { return $this->_value; } /** * 返回该色彩在RGB色彩空间的描述 * @return RGB */ public function toRGB() { $hue = $this->getHue(); $saturation = $this->getSaturation(); $value = $this->getValue(); $hi = floor($hue / 60) % 6; $f = $hue / 60 - $hi; $p = $value * (1 - $saturation); $q = $value * (1 - $f * $saturation); $t = $value * (1 - (1 - $f) * $saturation); switch ($hi) { case 0: $red = $value; $green = $t; $blue = $p; break; case 1: $red = $q; $green = $value; $blue = $p; break; case 2: $red = $p; $green = $value; $blue = $t; break; case 3: $red = $p; $green = $q; $blue = $value; break; case 4: $red = $t; $green = $p; $blue = $value; break; case 5: $red = $value; $green = $p; $blue = $q; break; default: throw new ErrorException('HSV Conversion RGB failure!'); break; }; require_once 'RGB.php'; return new RGB($red, $green, $blue); } /** * 返回数组形式表达 * @return array */ public function toArray() { return array( 'hue' => $this->getHue(), 'saturation' => $this->getSaturation(), 'value' => $this->getValue() ); } }
_red = $red; $this->_green = $green; $this->_blue = $blue; } /** * 获取红色分量 * @return float */ public function getRed() { return $this->_red; } /** * 获取绿色分量 * @return float */ public function getGreen() { return $this->_green; } /** * 获取蓝色分量 * @return float */ public function getBlue() { return $this->_blue; } /** * 返回该色彩的HSL空间描述 * @return HSL */ public function toHSL() { $r = $this->getRed(); $g = $this->getGreen(); $b = $this->getBlue(); $rgb = array($r, $g, $b); $max = max($rgb); $min = min($rgb); $diff = $max - $min; if ($max == $min) { $h = 0; } else if ($max == $r && $g >= $b) { $h = 60 * (($g - $b) / $diff); } else if ($max == $r && $g < $b) { $h = 60 * (($g - $b) / $diff) + 360; } else if ($max == $g) { $h = 60 * (($b - $r) / $diff) + 120; } else if ($max == $b) { $h = 60 * (($r - $g) / $diff) + 240; } else { throw new ErrorException("RGB conversion HSL failure!"); } $l = ($max + $min) / 2; if ($l == 0 || $max == $min) { $s = 0; } else if (0 < $l && $l <= 0.5) { $s = $diff / (2 * $l); } else if ($l > 0.5) { $s = $diff / (2 - 2 * $l); } else { throw new ErrorException("RGB conversion HSL failure!"); } require_once 'HSL.php'; return new HSL($h, $s, $l); } /** * 返回此色彩的HSV空间描述 * @return HSV */ public function toHSV() { $red = $this->getRed(); $green = $this->getGreen(); $blue = $this->getBlue(); $rgb = array($red, $green, $blue); $max = max($rgb); $min = min($rgb); $diff = $max - $min; /* 计算色相 */ if ($max == $min) { $hue = 0; } else if ($max == $red && $green >= $blue) { $hue = 60 * (($green - $blue) / $diff); } else if ($max == $red && $green < $blue) { $hue = 60 * (($green - $blue) / $diff) + 360; } else if ($max == $green) { $hue = 60 * (($blue - $red) / $diff) + 120; } else if ($max == $blue) { $hue = 60 * (($red - $green) / $diff) + 240; } else { throw new ErrorException("compute hue failure!"); } /* 计算饱和度 */ if ($max == 0) { $saturation = 0; } else { $saturation = 1 - $min / $max; } /* 计算色调 */ $value = $max; require_once 'HSV.php'; return new HSV($hue, $saturation, $value); } /** * 返回该色彩的数组表现形式 */ public function toArray() { return array( 'red' => $this->getRed(), 'green' => $this->getGreen(), 'blue' => $this->getBlue() ); } }
Effect test (requires phpunit support)
object = new HSL(120, 1, 0.75); } /** * Tears down the fixture, for example, closes a network connection. * This method is called after a test is executed. */ protected function tearDown() { } /** * @todo Implement testGetHue(). */ public function testGetHue() { $this->assertEquals(120, $this->object->getHue()); } /** * @todo Implement testGetSaturation(). */ public function testGetSaturation() { $this->assertEquals(1, $this->object->getSaturation()); } /** * @todo Implement testGetLightness(). */ public function testGetLightness() { $this->assertEquals(0.75, $this->object->getLightness()); } /** * @todo Implement testToRGB(). */ public function testToRGB() { $this->assertEquals(new RGB(0.5, 1, 0.5), $this->object->toRGB()); } /** * @todo Implement testToArray(). */ public function testToArray() { $this->assertEquals(array( 'hue' => 120, 'saturation' => 1, 'lightness' => 0.75 ), $this->object->toArray()); } }
object = new HSV(120, 0.5, 1); } /** * Tears down the fixture, for example, closes a network connection. * This method is called after a test is executed. */ protected function tearDown() { } /** * @todo Implement testGetHue(). */ public function testGetHue() { $this->assertEquals(120, $this->object->getHue()); } /** * @todo Implement testGetSaturation(). */ public function testGetSaturation() { $this->assertEquals(0.5, $this->object->getSaturation()); } /** * @todo Implement testGetValue(). */ public function testGetValue() { $this->assertEquals(1, $this->object->getValue()); } /** * @todo Implement testToRGB(). */ public function testToRGB() { $this->assertEquals(new RGB(0.5, 1, 0.5), $this->object->toRGB()); } /** * @todo Implement testToArray(). */ public function testToArray() { $this->assertEquals(array( 'hue' => 120, 'saturation' => 0.5, 'value' => 1 ), $this->object->toArray()); } }
object = new RGB(0.5, 1, 0.5); } /** * Tears down the fixture, for example, closes a network connection. * This method is called after a test is executed. */ protected function tearDown() { } /** * @todo Implement testGetRed(). */ public function testGetRed() { $this->assertEquals(0.5, $this->object->getRed()); } /** * @todo Implement testGetGreen(). */ public function testGetGreen() { $this->assertEquals(1, $this->object->getGreen()); } /** * @todo Implement testGetBlue(). */ public function testGetBlue() { $this->assertEquals(0.5, $this->object->getBlue()); } /** * @todo Implement testToHSL(). */ public function testToHSL() { $this->assertEquals(new HSL(120, 1, 0.75), $this->object->toHSL()); } /** * @todo Implement testToHSV(). */ public function testToHSV() { $this->assertEquals(new HSV(120, 0.5, 1), $this->object->toHSV()); } /** * @todo Implement testToArray(). */ public function testToArray() { $this->assertEquals(array( 'red' => 0.5, 'green' => 1, 'blue' => 0.5 ), $this->object->toArray()); } }
Recommended study: "PHP Video Tutorial"
The above is the detailed content of How to achieve color space conversion in php. For more information, please follow other related articles on the PHP Chinese website!