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 可以看到 亮度的变化