Градиент на 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> </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 [15434 просмотра]