2012-03-16 45 views
1

PHPで色の配列を作成できますか?私がやろうとしている何PHPで色の配列を生成

  1. 開始と終了色
  2. を選択して「ステップ」
  3. の量を選択してください(勾配として)一緒にブレンドそれらの色の配列を作成します。その量のステップで

例:

開始色:ホワイト
エンドカラー:ブラック
ステップ:3

結果:

  1. "白"、
  2. "gレイ」、
  3. "黒" の色はRGB /六角にこの上の溶液で

    誰でもだろう。もちろん、

+5

あなたはこれまでに何を試しましたか?あなたは誰かがあなたにcodezを与えることを単に望みますか? –

+0

あなたは解決策から離れてグーグルをしています。 – heldt

+0

[参考値としてインデックス番号を使用して、PHPで2色の平均色を計算する]を参照してください(http://stackoverflow.com/questions/4526062/calculating-the-average-color-between-two-colors -in-php-index-number-aを使用しています)。 –

答えて

4
$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)) 
    ); 
} 
+0

グレースケールで正常に動作するかもしれませんが、カラーでこの問題が発生します。どのようにそれらに取り組む上の任意のアイデア? – RoXaS

+0

@Roxas:どのような問題? – symcbean

+0

さて、暗い青色から薄い青色まで試しましたが、7桁の16進コードを返します。結果は0アルファになりますので、背景色が得られます。私は今仕事中ですので、ここではアウトプットを入手できません。 – RoXaS

0

基本的なチュートリアルhereは、出発点として使用できる16進色の作成についてです。重要なアイデアは、別々のRGBベース16進コードに沿って進める方法を理解して、連続した数字ではなく色を円滑に進めることができるようにすることです。

1
//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) 
    ; 
} 
1

を作成するには

B、R、Gの配列、さ(RGB)0x000000から0x112233などの1つの数値で、まずすべての値を抽出する必要があります。

012あなたには、いくつかのステッピングアルゴリズムを作成するために持っているよりも
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機能も必要です。

0

私はドライバのルートから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; 
} 
関連する問題