PHP で、時間別に色を分ける方法(虹色のようなパレットを作りたい)

まず、赤→橙→黄→緑→青と徐々に変化する虹色のようなパレットを考える。

この色の変化(RGB=Red, Green, Blue の順)は、

赤 (255, 0, 0) 橙 (255, 128, 0) 黄 (255, 255, 0) 緑 (0, 255, 0) シアン (0, 255, 255) 青 (0, 0, 255)

という順になるから、これがわかっていれば後は簡単。それぞれの値の間を時間の値(0~23時)適当に埋めていけばよい。

それがわかれば、1日の時間を感覚的な色(あくまでも筆者の感覚)で以下のように表すことができる。以下のコードは、元の画像に、x と y の配列で用意した座標に時間ごとに色を変えながら点を打っていくもの。

<?php $filename = 'sample.jpg'; // 点の座標 $x = array(0 => 0, 1 => 10, 2=>20, ... 23 まで適当に用意); $y = array(0 => 0, 1 => 10, 2=>20, ... 23 まで適当に用意); $image = @imagecreatefromjpeg($filename); $white = imagecolorallocate($image, 255, 255, 255); $red = 255; $green = 255; $blue = 255; for($hour = 0; $hour < 24; $hour++) { // 9時から 11時まで if(9 <= $hour && $hour < 12) { // 黄(255, 255, 0)→赤(255, 0, 0) <pre>$red = 255; $green = 255 - (12 - $hour) * (255 / (12 - 9)); $blue = 0; // 12時から 17時まで } else if(12 <= $hour && $hour < 17) { // 赤(255, 0, 0)→橙(255, 128, 0) <pre>$red = 255; $green = (17 - $hour) * (128 / (17 - 12)); $blue = 0; // 17時から 19時まで } else if(17 <= $hour && $hour < 19) { // 橙(255, 128, 0)→シアン(0, 255, 255) <pre>$red = 255 - (19 - $hour) * (255 / (19 - 17)); $green = 128 + (19 - $hour) * (128 / (19 - 17)); $blue = 0 + (19 - $hour) * (255 / (19 - 17)); // 19時から 22時まで } else if(19 <= $hour && $hour < 23) { // シアン(0, 255, 255)→青(0, 0, 255) <pre>$red = 0; $green = 255 - (23 - $hour) * (255 / (23 - 19)); $blue = 255; // 22時から 深夜 2時まで } else if(23 <= $hour || $hour < 3) { // 青(0, 0, 255)→紫(128, 0, 128) <pre>$hour = $hour == 23 ? -1 : $hour; $red = 0; $green = 0; $blue = 255 - ((3 - $hour) * (128 / 4)); // 深夜 3時から 朝 7時まで } else if(3 <= $hour && $hour < 7) { // 紫(128, 0, 128)→黄(255, 255, 0) <pre>$red = 128 + (7 - $hour) * (128 / (7 - 3)); $green = 0 + (7 - $hour) * (255 / (7 - 3)); $blue = 255 - (7 - $hour) * (255 / (7 - 3)); } $color = imagecolorallocate($image, $red, $green, $blue); imagefilledellipse($image, $x[$hour] - 2, $y[$hour] - 2, 4, 4, $color); } ?>