БлогNot. Градиент на PHP

Градиент на PHP

Рисовать средствами PHP градиенты для непосредственного использования "из кода на сайте" было бы бессмысленно - для этого есть CSS. А вот для генерации картинки-градиента PHP может оказаться ничем не хуже любых других средств, по крайней мере, не нужно устанавливать и запускать Photoshop или скриншотить заливку из Word'а, если нужен простенький двухцветный "перелив".

Показанный ниже простой сервис умеет строить двухцветный горизонтальный, вертикальный или радиальный (от центра) градиент заданного размера и для заданных цветов. В коде видно, как несложны действия, основные из них закомментированы. Функцию scale (вместе с limits) можно использовать для произвольного пересчёта "из отрезка в отрезок", например, значение функции y, принадлежащее интервалу [ymin,ymax], можно пересчитать в значение y1 (вертикальная координата точки на экране), принадлежащее интервалу [0,height], с помощью вызова

$y1=scale ($ymin,$y,$ymax,0,$height);
Если 2 последних параметра поменять местами, значение $y1 "перевернётся", как и надо при отображении на графической канве, у которой ось 0Y всегда направлена сверху вниз.

 Скрипт в работе

Скрипт принимает параметры методом GET (через URL-адрес), так что можно сохранять ссылки на картинки. Если переставить местами начальный и конечный цвета, картинка обратима. Пример: туда, обратно.

Полный исходник скрипта:

<?php
//Настройки минимума, значения по умолчанию, максимума для ширины и высоты картинки
define('MIN_WIDTH','32');
define('DEFAULT_WIDTH','100');
define('MAX_WIDTH','800');
define('MIN_HEIGHT','32');
define('DEFAULT_HEIGHT','60');
define('MAX_HEIGHT','600');
//Проверка доступности библиотеки GDLib на хостинге
function gdVersion() {
  $gdv=@gd_info();  $ver=$gdv['GD Version'];  $v=0;
  if (preg_match("/.*([0-9]+)\.([0-9]+)\.([0-9]+).*/",$ver,$r)) 
   $v=$r[1];
  return $v;
 }
if (gdVersion()<2) exit ("Need GDLib 2 or higher");
//Если не переданы данные - вывести форму и выйти
if (!isset($_GET['submit'])) {
 echo '
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">
  <html>
  <head>
   <meta content="text/html; charset=Windows-1251" http-equiv="content-type">
   <title>Градиент</title>
  </head>
  <body>
  <form method="get" action="'.$_SERVER['PHP_SELF'].'" target="_blank">
  <table border="0" cellpadding="4" cellspacing="0">
  <tr>
    <td>Тип градиента</td>
    <td>
     <select name="type" size="1">
      <option value="g" selected>Горизонтальный
      <option value="v">Вертикальный
	  <option value="r">От центра
     </select>
    </td>
   </tr>
   <tr>
    <td>Ширина картинки (пикселов, '.MIN_WIDTH.'-'.MAX_WIDTH.')</td>
    <td>
     <input type="text" name="w" value="'.DEFAULT_WIDTH.'" size="3" maxlength="3">
    </td>
   </tr>
   <tr>
    <td>Высота картинки (пикселов, '.MIN_HEIGHT.'-'.MAX_HEIGHT.')</td>
    <td>
     <input type="text" name="h" value="'.DEFAULT_HEIGHT.'" size="3" maxlength="3">
    </td>
   </tr>
   
   <tr>
    <td>Цвет начала (RRGGBB)</td>
    <td>
     <input type="text" name="s" value="000000" size="6" maxlength="6">
    </td>
   </tr>
   <tr>
    <td>Цвет конца (RRGGBB)</td>
    <td>
     <input type="text" name="e" value="FFFFFF" size="6" maxlength="6">
    </td>
   </tr>
   <tr>
    <td>&nbsp;</td>
    <td>
     <input type="submit" name="submit" value="OK">
    </td>
   </tr>
  </table>
  </form>
  </body></html>
 ';
 exit(0);
}
//Основной код скрипта
$type = 'g'; //определяем тип
if (isset($_GET['type'])) {
 $t=trim($_GET['type']);
 if ($t=='v' || $t=='r') $type=$t;
}
$height = (isset($_GET['h'])) ? intval($_GET['h']) : DEFAULT_HEIGHT; //определяем высоту
if ($height<MIN_HEIGHT or $height>MAX_HEIGHT) $height=DEFAULT_HEIGHT;
$width = (isset($_GET['w'])) ? intval($_GET['w']) : DEFAULT_WIDTH; //определяем ширину
if ($width<MIN_WIDTH or $width>MAX_WIDTH) $width=DEFAULT_WIDTH;
$start = (isset($_GET['s']) && 
 preg_match('#[0-9A-Fa-f]{6}#',$_GET['s'])) ? $_GET['s'] : '000000'; //определяем цвета
$end = (isset($_GET['e']) && 
 preg_match('#[0-9A-Fa-f]{6}#',$_GET['e'])) ? $_GET['e'] : 'FFFFFF';

$start_r= hexdec(substr($start, 0, 2)); //определяем RGB цветов
$start_g = hexdec(substr($start, 2, 2));
$start_b = hexdec(substr($start, 4, 2));
$end_r = hexdec(substr($end, 0, 2));
$end_g = hexdec(substr($end, 2, 2));
$end_b = hexdec(substr($end, 4, 2));

$image = imagecreatetruecolor($width, $height); //создаём картинку

function limits ($a,$x,$b) { return ($x<$a?$a:($x>$b?$b:$x)); } //контроль лимита цветов
function scale ($a,$x,$b,$c,$d) { //масштабирование x из интервала [a,b] в y из интервала [c,d], a<b
 return ($c<$d ?
  limits($c,round($c+($x-$a)*(($d-$c)/($b-$a))),$d) :
  limits($d,round($c-($x-$a)*(($c-$d)/($b-$a))),$c)
 ); 
} 

if ($type == 'g') { //рисуем градиент выбранного типа
 for ($x=0; $x<$width; $x++) {
  $new_r = $start_r - round(($start_r - $end_r) / $width * $x);
  $new_g = $start_g - round(($start_g - $end_g) / $width * $x);
  $new_b = $start_b - round(($start_b - $end_b) / $width * $x);
  $row_color = imagecolorresolve($image, $new_r, $new_g, $new_b);
  imageline($image, $x, 0, $x, $height, $row_color);
 }
}
else if ($type == 'v') {
 for ($y=0; $y<$height; $y++) {
  $new_r = $start_r - round(($start_r - $end_r) / $height * $y);
  $new_g = $start_g - round(($start_g - $end_g) / $height * $y);
  $new_b = $start_b - round(($start_b - $end_b) / $height * $y);
  $row_color = imagecolorresolve($image, $new_r, $new_g, $new_b);
  imageline($image, 0, $y, $width, $y, $row_color);
 }
}
else if ($type == 'r') {
 $b=round(sqrt(pow($width,2)+pow($height,2))/2.);
 for ($i=0; $i<$width; $i++)
 for ($j=0; $j<$height; $j++) {
  $x = round(sqrt(pow($i-$width/2.,2)+pow($j-$height/2.,2)));
  $new_r=scale (0,$x,$b,$start_r,$end_r);
  $new_g=scale (0,$x,$b,$start_g,$end_g);
  $new_b=scale (0,$x,$b,$start_b,$end_b);
  $color = imagecolorresolve ($image, $new_r, $new_g, $new_b);
  imagesetpixel ($image, $i, $j, $color);
 }
}

header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>

Ограничения на минимальные/максимальные размеры произвольны, при установке скрипта к себе на хостинг их можно поменять в начале кода.

27.05.2014, 00:00 [15300 просмотров]


теги: цвет графика php алгоритм сервис

К этой статье пока нет комментариев, Ваш будет первым