帝国CMS模板大全
www.admin99.cn
www.92cms.cn 帝国CMS模板下载站!,情怀,养站,二次开发!源码需求比较大的一站式会员下载,价更省!!!

php怎么实现色彩空间转换

php实现色彩空间转换的方法:首先创建一个PHP示例文件;然后创建“HSL、HSV、RGB色彩空间”;最后通过“protected function tearDown(){…}”等方法实现转换。

本文操作环境:windows7系统、PHP7.1版,DELL G3电脑

php怎么实现色彩空间转换?

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

<?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 
*/
    protected $_saturation;
 
    /**
* 色调 0-1
* @var float 
*/
    protected $_value;
 
    /**
* 构造
* @param float $hue 色相
* @param float $saturation 饱和度
* @param float $value 色调
*/
    public function __construct($hue=0, $saturation=0, $value=0) {
   $this->_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()
   );
    }
 
}

<?php
 
/**
 * RGB色彩空间描述
 * @author shizhuolin
 */
class RGB {
 
    /**
* 红色 0-1
* @var float 
*/
    protected $_red;
 
    /**
* 绿色 0-1
* @var float 
*/
    protected $_green;
 
    /**
* 蓝色 0-1
* @var float 
*/
    protected $_blue;
 
    /**
* 以初始值构造
* @param float $red 红色0-1
* @param float $green 绿色0-1
* @param float $blue 蓝色0-1
*/
    public function __construct($red = 0, $green = 0, $blue = 0) {
   $this->_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()
   );
    }
 
}

效果测试(需要phpunit支持)

<?php
 
require_once dirname(__FILE__) . '/color/RGB.php';
require_once dirname(__FILE__) . '/color/HSL.php';
require_once dirname(__FILE__) . '/color/HSV.php';
 
/**
 * Test class for HSL.
 * Generated by PHPUnit on 2011-11-29 at 16:56:17.
 */
class HSLTest extends PHPUnit_Framework_TestCase {
 
    /**
* @var HSL
*/
    protected $object;
 
    /**
* Sets up the fixture, for example, opens a network connection.
* This method is called before a test is executed.
*/
    protected function setUp() {
   $this->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());
    }
 
}

<?php
 
require_once dirname(__FILE__) . '/color/RGB.php';
require_once dirname(__FILE__) . '/color/HSL.php';
require_once dirname(__FILE__) . '/color/HSV.php';
 
/**
 * Test class for HSV.
 * Generated by PHPUnit on 2011-11-29 at 16:49:00.
 */
class HSVTest extends PHPUnit_Framework_TestCase {
 
    /**
* @var HSV
*/
    protected $object;
 
    /**
* Sets up the fixture, for example, opens a network connection.
* This method is called before a test is executed.
*/
    protected function setUp() {
   $this->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());
    }
 
}

<?php
 
require_once dirname(__FILE__) . '/color/RGB.php';
require_once dirname(__FILE__) . '/color/HSL.php';
require_once dirname(__FILE__) . '/color/HSV.php';
 
/**
 * Test class for RGB.
 * Generated by PHPUnit on 2011-11-29 at 16:38:54.
 */
class RGBTest extends PHPUnit_Framework_TestCase {
 
    /**
* @var RGB
*/
    protected $object;
 
    /**
* Sets up the fixture, for example, opens a network connection.
* This method is called before a test is executed.
*/
    protected function setUp() {
   $this->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());
    }
 
}

推荐学习:《PHP视频教程》

以上就是php怎么实现色彩空间转换的详细内容!

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《php怎么实现色彩空间转换》
文章链接:https://www.admin99.cn/7284
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
QQ站长交流群:953950264

登录

找回密码

注册