PHPで色の配列を作成できますか?私がやろうとしている何PHPで色の配列を生成
:
- 開始と終了色
- を選択して「ステップ」
- の量を選択してください(勾配として)一緒にブレンドそれらの色の配列を作成します。その量のステップで
例:
開始色:ホワイト
エンドカラー:ブラック
ステップ:3
結果:
- "白"、
- "gレイ」、
- "黒" の色はRGB /六角にこの上の溶液で
誰でもだろう。もちろん、
?
PHPで色の配列を作成できますか?私がやろうとしている何PHPで色の配列を生成
:
例:
開始色:ホワイト
エンドカラー:ブラック
ステップ:3
結果:
誰でもだろう。もちろん、
?
$greys=rainbow('000000','FFFFFF',3);
function rainbow($start, $end, $steps)
{
$s=str_to_rgb($start);
$e=str_to_rgb($end);
$out=array();
$r=(integer)($e['r'] - $s['r'])/$steps;
$g=(integer)($e['g'] - $s['g'])/$steps;
$b=(integer)($e['b'] - $s['b'])/$steps;
for ($x=0; $x<$steps; $x++) {
$out[]=rgb_to_str(
$s['r']+(integer)($r * $x),
$s['g']+(integer)($g * $x),
$s['b']+(integer)($b * $x));
}
return $out;
}
function rgb_to_str($r, $g, $b)
{
return str_pad($r, 2, '0', STR_PAD_LEFT)
.str_pad($g, 2, '0', STR_PAD_LEFT)
.str_pad($b, 2, '0', STR_PAD_LEFT);
}
function str_to_rgb($str)
{
return array (
'r'=>hexdec(substr($str, 0, 2)),
'g'=>hexdec(substr($str, 3, 2)),
'b'=>hexdec(substr($str, 5, 2))
);
}
基本的なチュートリアルhereは、出発点として使用できる16進色の作成についてです。重要なアイデアは、別々のRGBベース16進コードに沿って進める方法を理解して、連続した数字ではなく色を円滑に進めることができるようにすることです。
//Assumption: $start and $end have the start/end colors, $steps has the step count
$start=array(255,255,255); //White
$end=array(0,0,0); //Black
$steps=3;
$colors=array($start); //You want the start color to be part of the result array
$intervals=$steps-1; //You want 3 steps to mean 2 intervals
$current=$start;
$delta=array(
($end[0]-$start[0])/$intervals,
($end[1]-$start[1])/$intervals,
($end[2]-$start[2])/$intervals
);
for ($i=1;$i<$intervals;$i++) {
$current=array($current[0]+$delta[0],$current[1]+$delta[1],$current[2]+$delta[2]);
$colors[]=array(round($current[0],$current[1],$current[2]);
}
$colors[]=$end; //You want the end color to be part of the result array
はあなたの色の配列を与える、それぞれのあなたは色を持っているとしましょう16進表現を使用
function hexcolorFromArraycolor($arraycolor) {
return '#'
.substr('0'.dechex($arraycolor[0]),-2)
.substr('0'.dechex($arraycolor[1]),-2)
.substr('0'.dechex($arraycolor[2]),-2)
;
}
を作成するには
B、R、Gの配列、さ(RGB)0x000000
から0x112233
などの1つの数値で、まずすべての値を抽出する必要があります。
function hexToArray($value){
return array(
'r' => ($value >> 16) & 0xff,
'g' => ($value >> 8) & 0xff,
'b' => ($value >> 0) & 0xff,
);
}
、最も明白な各ステップで各コンポーネントを増加している。
ようになりRi = Rstart + floor(i * (Rend - Rstart)/ steps)
:
$steps--; // Due to 0
$a = hexToArray(0x000000);
$b = hexToArray(0x112233);
$step = array();
$result = array();
// Prepare steps
foreach(array('r', 'g', 'b') as $color){
$step[$color] = ($b[$color] - $a['color'])/$steps;
}
for($i = 0; $i <= $steps; $i++){
$tmp = array();
foreach(array('r', 'g', 'b') as $color){
$tmp[$color] = $a['color'] + floor($step[$color]*$i);
}
$result[] = $tmp;
}
return $result;
あなたはまた、変換を追加することができますlong int
または文字列に戻してください。
16進値を使用する場合は、他のhexToArray
機能も必要です。
私はドライバのルートからGPSポイントを取得し、それらを(Googleマップを使用して)時間でマップする必要がありました。私は彼らが最も古いものから最も新しいものまで虹色になると思った。私は良い出発点としてhttp://www.efg2.com/Lab/ScienceAndEngineering/Spectra.htmを見つけました。私はPHP関数として書き直しました...
$blue = 0;
$factor = 0;
$green = 0;
$red = 0;
function adjustColor($color) {
global $factor;
if ($color == 0.0) {
return 0;
} else {
return round (255.0 * pow (($color * $factor), 0.80));
}
}
function setColors($wavelength) {
global $red, $green, $blue;
if ($wavelength >= 380 && $wavelength <= 439) {
$red = - ($wavelength - 440.0)/(440.0 - 380.0);
$green = 0.0;
$blue = 1.0;
} elseif ($wavelength >= 440 && $wavelength <= 489) {
$red = 0.0;
$green = ($wavelength - 440.0)/(490.0 - 440.0);
$blue = 1.0;
} elseif ($wavelength >= 490 && $wavelength <= 509) {
$red = 0.0;
$green = 1.0;
$blue = - ($wavelength - 510.0)/(510.0 - 490.0);
} elseif ($wavelength >= 510 && $wavelength <= 579) {
$red = ($wavelength - 510.0)/(580.0 - 510.0);
$green = 1.0;
$blue = 0.0;
} elseif ($wavelength >= 580 && $wavelength <= 644) {
$red = 1.0;
$green = - ($wavelength - 645.0)/(645.0 - 580.0);
$blue = 0.0;
} elseif ($wavelength >= 645 && $wavelength <= 780) {
$red = 1.0;
$green = 0.0;
$blue = 0.0;
} else {
$red = 0.0;
$green = 0.0;
$blue = 0.0;
}
}
function setFactor($wavelength) {
global $factor;
if ($wavelength >= 380 && $wavelength <= 419) {
$factor = 0.3 + 0.7 * ($wavelength - 380.0)/(420.0 - 380.0);
} elseif ($wavelength >= 420 && $wavelength <= 700) {
$factor = 1.0;
} elseif ($wavelength >= 701 && $wavelength <= 780) {
$factor = 0.3 + 0.7 * (780.0 - $wavelength)/(780.0 - 700.0);
} else {
$factor = 0.0;
}
}
次に、関数を使用して各点の色を取得します。
for($i = 0; $i < $numSteps; $i ++) {
$lambda = round (380 + 400 * ($i/($numSteps - 1)));
setColors ($lambda);
setFactor ($lambda);
$red = adjustColor ($red, $factor);
$green = adjustColor ($green, $factor);
$blue = adjustColor ($blue, $factor);
$redHex = dechex ($red);
$redHex = (strlen ($redHex) < 2) ? "0" . $redHex : $redHex;
$greenHex = dechex ($green);
$greenHex = (strlen ($greenHex) < 2) ? "0" . $greenHex : $greenHex;
$blueHex = dechex ($blue);
$blueHex = (strlen ($blueHex) < 2) ? "0" . $blueHex : $blueHex;
$bgcolor = "#" . $redHex . $greenHex . $blueHex;
echo $bgcolor;
}
あなたはこれまでに何を試しましたか?あなたは誰かがあなたにcodezを与えることを単に望みますか? –
あなたは解決策から離れてグーグルをしています。 – heldt
[参考値としてインデックス番号を使用して、PHPで2色の平均色を計算する]を参照してください(http://stackoverflow.com/questions/4526062/calculating-the-average-color-between-two-colors -in-php-index-number-aを使用しています)。 –