PHP HSV色相 饱和度 亮度 增强

PHP HSV色相 饱和度 亮度 增强
在开始之前我们先了解一下什么是HSV
HSV 是颜色模型
色调H
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度S
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
明度V
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的。
HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。
在这里插入图片描述
1、HSV是一种将RGB色彩空间中的点在倒圆锥体中的表示方法。HSV即色相(Hue)、饱和度(Saturation)、明度(Value),又称HSB(B即Brightness)。色相是色彩的基本属性,就是平常说的颜色的名称,如红色、黄色等。饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。明度(V),取0-max(计算机中HSV取值范围和存储的长度有关)。HSV颜色空间可以用一个圆锥空间模型来描述。圆锥的顶点处,V=0,H和S无定义,代表黑色。圆锥的顶面中心处V=max,S=0,H无定义,代表白色。
在这里插入图片描述这里具体讲解什么是HSV

<?php 
 //R, G and B input range = 0 ÷ 255
//H, S and V output range = 0 ÷ 1.0
 $imagesize = getimagesize("自由网.jpg");//获取文件大小
 $imageinfo  = imagecreatefromjpeg("自由网.jpg");//获取图片
 $RGB =array(); 

  for($h=0; $h <$imagesize['1'] ; $h++) //循环高
  { 
       for ($w=0; $w <$imagesize['0'] ; $w++) 
       { 
           $temp_rgb =  imagecolorat($imageinfo,$w,$h);//获得某像素的颜色索引值
           $RGB[$h][$w] = imagecolorsforindex($imageinfo,$temp_rgb);//取得某索引的颜色s
       }
  }

$arrs = array();
for($h=0; $h <$imagesize['1'] ; $h++) //循环高
{ 
   for ($w=0; $w <$imagesize['0'] ; $w++) 
   { 
       $temp_rgb =  imagecolorat($imageinfo,$w,$h);//获得某像素的颜色索引值
       $arrs[$h][$w] = RGB(imagecolorsforindex($imageinfo,$temp_rgb));//取得某索引的颜色s
   }
}
function RGB($arr){

    $R = $arr['red'];
    $G = $arr['green'];
    $B = $arr['blue'];
    $var_R = ( $R / 255 );
    $var_G = ( $G / 255 );
    $var_B = ( $B / 255 );

    $var_Min = min( $var_R, $var_G, $var_B );    //Min. value of RGB
    $var_Max = max( $var_R, $var_G, $var_B );    //Max. value of RGB
    $del_Max = $var_Max - $var_Min   ;          //Delta RGB value

    $V = $var_Max;

    if ( $del_Max == 0 )                     //This is a gray, no chroma...
    {
        $H = 0;
        $S = 0;
    }
    else                                    //Chromatic data...
    {
       $S = $del_Max / $var_Max;

       $del_R = ( ( ( $var_Max - $var_R ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
       $del_G = ( ( ( $var_Max - $var_G ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
       $del_B = ( ( ( $var_Max - $var_B ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;

       if      ( $var_R == $var_Max ) $H = $del_B - $del_G;
       else if ( $var_G == $var_Max ) $H = ( 1 / 3 ) + $del_R - $del_B;
       else if ( $var_B == $var_Max ) $H = ( 2 / 3 ) + $del_G - $del_R;

        if ( $H < 0 ) $H += 1;
        if ( $H > 1 ) $H -= 1;
    }
    // echo $H."<br>" ; 
    // echo $S."<br>" ; 
    // echo $V."<br>" ; 
 
    $H *=1.01 ;
    $S *=1.35 ;
    $V *=1.3005 ;
 
    if ($H>=1) {
       $H = 1;
    }
     if ($S>=1) {
       $S = 1;
    }
    // $V *=1.2;
    //  if ($S<=0) {
    //    $S = 0;
    // }
    if ($V>=1) {
       $V =  1;
    }

    return  Gs($H,$S,$V);
    //H, S and V input range = 0 ÷ 1.0
    //R, G and B output range = 0 ÷ 255

 }
function Gs($H,$S,$V){

    if ( $S == 2 )
    {
       $R = $V * 255;
       $G = $V * 255;
       $B = $V * 255;
    }
    else
    {
       $var_h = $H * 6;
       if ( $var_h == 6 ) $var_h = 0   ;   //H must be < 1
       $var_i = intval($var_h)  ;           //Or ... $var_i = floor( $var_h )
       $var_1 = $V * ( 1 - $S );
       $var_2 = $V * ( 1 - $S * ( $var_h - $var_i ) );
       $var_3 = $V * ( 1 - $S * ( 1 - ( $var_h - $var_i ) ) );

       if      ( $var_i == 0 ) { $var_r = $V     ; $var_g = $var_3 ; $var_b = $var_1; }
       else if ( $var_i == 1 ) { $var_r = $var_2 ; $var_g = $V     ; $var_b = $var_1; }
       else if ( $var_i == 2 ) { $var_r = $var_1 ; $var_g = $V     ; $var_b = $var_3; }
       else if ( $var_i == 3 ) { $var_r = $var_1 ; $var_g = $var_2 ; $var_b = $V;     }
       else if ( $var_i == 4 ) { $var_r = $var_3 ; $var_g = $var_1 ; $var_b = $V;     }
       else                   { $var_r = $V     ; $var_g = $var_1 ; $var_b = $var_2; }

       $arrs['red'] = $var_r * 255;
       $arrs['green']  = $var_g * 255;
       $arrs['blue']  = $var_b * 255;
    return $arrs;
    }


}

$im = imagecreatetruecolor(1500,700); //生成真彩图片
$black = imagecolorallocate($im,220,230,250);//设置颜色
imagefill($im,10,1,$black) ;  //填充  // 从左上角开始填充灰色//背景
  foreach ($RGB as $key => $value) {
      foreach ($value as $keys => $values) {
         $R = imagecolorallocate($im,$values['red'],$values['green'],$values['blue']);//设置颜色
         ImageFilledRectangle($im, $keys,$key, $keys,$key, $R);//绘制图案
         $R = imagecolorallocate($im,$arrs[$key][$keys]['red'],$arrs[$key][$keys]['green'],$arrs[$key][$keys]['blue']);//设置颜色
         // ImageFilledRectangle($im, $keys,$key, $keys,$key, $R);//绘制图案
         imagesetpixel($im,$keys+700,$key, $R);//绘制图案
     }

  }
  
  header("Content-type:image/png");//png格式
  imagepng($im);//输出
  
  imagedestroy($im);//释放内存
 ?>
 

在这里插入图片描述
这里的 H S V 是 设置 参数 范围 1.0 - 2,

在这里插入图片描述
在这里插入图片描述
将 V 设置 0.5 可以看到 亮度的变化
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值