Отправляет email-рассылки с помощью сервиса Sendsay

Web-Мастеринг - с нуля до профи

  Все выпуски  

нет.


Информационный Канал Subscribe.Ru

Познавательное программирование

(comp.soft.prog.urisprog)

Выпуск 27


Здравствуйте, Уважаемые подписчики!

Любая программа должна иметь ровно столько недоработок, чтобы она и сама неплохо работала, и позволяла неплохо зарабатывать программистам на её улучшениях.
- афоризм.


Предисловие от ведущего рассылки

С этого дня я начинаю указывать внизу свой ICQ.
Пожалуйста, не связывайтесь по нему со мной "просто так", только если у вас есть что-то конкретное.
Для любых предложений как всегда открыт мой e-mail.

А теперь статья для Веб-программистов.

PHP. Расширение php_gd2.

Итак, я надеюсь, что вам знакома аббревиатура PHP, иначе этот текст читать, по-моему, бесполезно.
А для чего же предназначен модуль php_gd? Для создания png- или gif-картинок, друг мой [в зависимости от поставки gd; вроде бы даже существует модуль с поддержкой обоих форматов], а также jpeg-изображений, поддерживаемых всеми версиями gd. Особо это полезно, когда вы хотите украсить вашу страничку каким-то динамически обновляющимся рисунком. Ну, например, баннером, выводящим размер сайта или отдельных страничек или даже папки сайта. Короче, придумаете что-нибудь. Можно даже просто строить графики различных функций прямо на сервере и пр.

;Windows Extensions
;extension=php_mysql.dll
;extension=php_nsmail.dll
;extension=php_calendar.dll
;extension=php_dbase.dll
;extension=php_filepro.dll
;extension=php_gd.dll
;extension=php_dbm.dll
;extension=php_mssql.dll
;extension=php_zlib.dll
;extension=php_filepro.dll
;extension=php_imap4r2.dll
;extension=php_ldap.dll
;extension=php_crypt.dll
;extension=php_msql2.dll
;extension=php_odbc.dll

То есть у меня подключены расширения ‘php_mysql’ и ‘php_gd’. Замечание: если вы впервые работаете в PHP, установите значение переменной ‘Register_globals’ в состояние On, иначе вы не сможете передавать переменные через PHP-странички [ради чего мы вообще-то и установили его ;)].

Итак, если вы всё сделали правильно [проверочные примеры смотрите в соответствующих пособиях], то можно начинать.

Прежде чем приступить к изучению gd, определим версию подключённой Вами библиотеки и все её функции, которые можно использовать в PHP. Для этого создадим страничку ‘gd_info.php’, содержащей следующий код:

<?php
echo("<h2><p align=center>Detecting all PHP extensions and their functions</p></h2>");
$i=get_loaded_extensions();
foreach($i as $ext)
{
echo("<hr><h3><p align=center>Extension [$ext]</p></h3>");
$j=get_extension_funcs($ext);
print_r($j);
}
?>


Запустим Internet Explorer и в адресной строке напишем адрес нашего гениального творения: http://localhost/gd_info.php. Данный скрипт выведет нам все функции подключённых и встроенных расширений PHP.

Чтобы получить информацию лишь о функциях gd измените скрипт следующим образом:

<?php
echo("<h3><p align=center>Extension php_gd</p></h3>");
$j=get_extension_funcs("gd");
print_r($j);
?>

В моей версии php_gd в наличии 81 функция.


Extension php_gd

Array ( [0] => gd_info [1] => imagearc . . . [81] => imagecolormatch )


Итак, от теории – к практике!

Задание 1: провести прямую из точки А с координатами (x1, y1) в точку Б с координатами (x2, y2).
Решение:

<?php

//Определяем размеры картинки.
$imgw=300;
$imgh=200;

//Создаём картинку.
$im=imagecreate($imgw,$imgh);

//Определяем координаты точки А и Б.
$Ax=30;
$Ay=30;
$Bx=270;
$By=170;

//Определяем цвет фона.
$bgcolor=imagecolorallocate($im,255,255,255);

//Определяем цвет линии.
$line_color=imagecolorallocate($im,255,0,0);

//Проводим линию.
imageline($im,$Ax,$Ay,$Bx,$By,$line_color);

//Создаём файл картинки.
$file="image.jpeg";
imagejpeg($im, $file);

echo("<p align=center><img src=$file></p>");

imagedestroy($im);

?>


Задание 2: залить картинку линейной градиентной заливкой.
Решение:

<?php

//Определяем размеры картинки.
$imgw=300;
$imgh=200;

//Создаём картинку.
$im=imagecreate($imgw,$imgh);

//Задаём начальный и конечный цвет градиента.
$start="000000";
$final="FFFFFF";

$reds=$start[0].$start[1];
$greens=$start[2].$start[3];
$blues=$start[4].$start[5];
$reds=hexdec($reds);
$greens=hexdec($greens);
$blues=hexdec($blues);

$redf=$final[0].$final[1];
$greenf=$final[2].$final[3];
$bluef=$final[4].$final[5];
$redf=hexdec($redf);
$greenf=hexdec($greenf);
$bluef=hexdec($bluef);

$koefr=($redf-$reds+1)/$imgh;
$koefg=($greenf-$greens+1)/$imgh;
$koefb=($bluef-$blues+1)/$imgh;

//Рисуем линии.
for($i=0;$i<=$imgh;$i++)
{
$gradr=$koefr*$i+$reds;
$gradg=$koefg*$i+$greens;
$gradb=$koefb*$i+$blues;
$col=imagecolorallocate($im,$gradr,$gradg,$gradb);
imageline($im,0,$i,$imgw,$i,$col);
}

//Создаём файл картинки.
$file="image.jpeg";
imagejpeg($im,$file);

//Разрушаем картинку.
imagedestroy($im);

//Выводим файл по центру.
echo("<p align=center><img src=$file></p>");

?>




Задание 3: залить картинку радиальной градиентной заливкой.
Решение:

<?php
//Определяем размеры картинки.
$imgw=400;
$imgh=400;

//Создаём картинку.
$im=imagecreate($imgw,$imgh);

//Задаём начальный и конечный цвет градиента.
$start="99CCFF";
$final="0000ff";

//Преобразуем 16-ричное представление в десятичное.
$reds=$start[0].$start[1];
$greens=$start[2].$start[3];
$blues=$start[4].$start[5];
$reds=hexdec($reds);
$greens=hexdec($greens);
$blues=hexdec($blues);

$redf=$final[0].$final[1];
$greenf=$final[2].$final[3];
$bluef=$final[4].$final[5];
$redf=hexdec($redf);
$greenf=hexdec($greenf);
$bluef=hexdec($bluef);

//Определяем диагональ картинки.
//$diag=sqrt($imgw*$imgw+$imgh*$imgh);

//Расчёт коэффициентов скорости изменения цвета.
$koefr=($redf-$reds)/$imgw;
$koefg=($greenf-$greens)/$imgw;
$koefb=($bluef-$blues)/$imgw;

//Определяем центр градиента.
$X_center=$imgw/2;
$Y_center=$imgh/2;

$col=imagecolorallocate($im,255,255,255);

//Рисуем круги.

$K=2; - некоторый коэффициент, учитывающий,
что круги при прорисовке накладываются друг на друга.

for($i=1; $i<=$imgw/$K; $i++)
{
$gradr=$koefr*$i*$K+$reds;
$gradg=$koefg*$i*$K+$greens;
$gradb=$koefb*$i*$K+$blues;

$col=imagecolorallocate($im,$gradr,$gradg,$gradb);

imagearc($im,$X_center,$Y_center,$K*$i,$K*$i,0,0,$col);
}

//Создаём файл картинки.
if($K<10) $file="00".$K.".jpeg";
elseif($K<100) $file="0".$K.".jpeg";
else $file=$K.".jpeg";

imagejpeg($im,$file);

//Разрушаем картинку.
imagedestroy($im);

//Выводим файл по центру.
echo(" <p align=center><img src=$file></p>");
?>


Задание 4: вывести текст 'Hello, world' в картинку внешним TTF- и встроенным шрифтом.
Решение:

<?php

//Определяем размеры картинки.
$imgw=300;
$imgh=200;

//Создаём картинку.
$im=imagecreate($imgw,$imgh);

//Задаём цвета фона и текста.
$bgcolor=imagecolorallocate($im,255,255,255);
$textcolor=imagecolorallocate($im,0,0,0);


//Определяем текст.
$text="Hello, world!";
//Определяем размер букв.
$size=40;
//Определяем угол вывода текста.
$angle=0;
//Определяем местоположение внешнего шрифта.
$font="corsiva.ttf";
//Определяем положение текста.
$X=32;
$Y=100;

//Выводим текст внешним шрифтом.
imagettftext($im,$size,$angle,$X,$Y,$textcolor,"corsiva.ttf",$text);

//Выводим текст встроенным шрифтом.
imagestring($im,5,$X,$Y+30,$text,$textcolor);

//Создаём файл катинки.
$file="image.jpeg";
imagejpeg($im,$file);

//Уничтожаем картинку.
imagedestroy($im);

echo("<p align=center><img src=$file></p>");

?>



Задание 5: вывести текст из предыдущего задания под произвольным углом.
Решение:

В тексте предыдущего скрипта изменить строчку $angle=0 на $angle=rand(0,360);
Так угол текста будет задаваться случайным числом на отрезке от 0 до 360.
Так как для встроенного шрифта угол наклона задать нельзя, то строчку imagestring($im,5,$X,$Y+30,$text,$textcolor); придётся удалить. >-(


Задание 6: скопировать в картинку часть из другой картинки.
Решение:

<?php

//Определяем размеры картинки.
$imgw=300;
$imgh=200;

//Создаём картинку.
$im_to=imagecreate($imgw,$imgh);

//Вводим исходную картинку.
$im_from=imagecreatefromjpeg("source.jpg");

//Определение параметров копирования.
//Координаты левого верхнего угла участка копирования.
$from_x=0; $from_y=0;
//Размеры участка копирования.
$from_w=119; $from_h=49;
//Координаты левого верхнего угла участка вставки.
$to_x=0; $to_y=$imgh/4;
//Размеры участка вставки.
$to_w=$imgw; $to_h=$imgh/2;

imagecopyresized($im_to,$im_from,$to_x,$to_y,$from_x,$from_y,$to_w,$to_h,$from_w,$from_h);

//Создаём файл картинки.
$file="image.jpeg";
imagejpeg($im_to,$file);

//Разрушаем картинку.
imagedestroy($im_to);
imagedestroy($im_from);

//Выводим файл по центру.
echo("<p align=center><img src=$file></p>");

?>



Задание 7: нарисовать график функции у = f(x).
Решение:

<?php

//Определяем функции.

function f1($x)
{
return 50*sin(0.1*$x-40);
}
function f2($x)
{
return 60*cos(0.05*$x+60)+120;
}
function f3($x)
{
return 0.1*$x*$x-50;
}
function f4($x)
{
return exp($x*0.015)-60;
}

//Определяем размеры картинки.
$imgw=500; $imgh=400;

//Создаём картинку.
$im=imagecreate($imgw,$imgh);

//Задаём цвет картинки, осей и графика.
$bgcolor=imagecolorallocate($im,255,255,255);
$axe_color=imagecolorallocate($im,0,0,0);
$graph_color1=imagecolorallocate($im,255,0,0);
$graph_color2=imagecolorallocate($im,0,255,0);
$graph_color3=imagecolorallocate($im,0,0,255);
$graph_color4=imagecolorallocate($im,255,0,255);

//Определяем параметры осей координат.
$x_left=50; $x_width=400;
$y_top=50; $y_height=200;

//Строим ось X и Y.
imageline($im,$x_left,$y_height+$y_top,$x_left+$x_width,$y_height+$y_top,$axe_color);
imageline($im,$x_left,$y_height+$y_top,$x_left,$y_top,$axe_color);

//Обозначаем оси.
imagestring($im,5,$x_left+$x_width+5,$y_top+$y_height-7,"X",$axe_color);
imagestring($im,5,$x_left-4,$y_top-19,"Y",$axe_color);
imagestring($im,5,$x_left-7,$y_top+$y_height,"0",$axe_color);

for($i=0; $i<=$x_width; $i++)
{
$result=f1($i);
imagesetpixel($im,$i+$x_left,$y_top+$y_height-$result,$graph_color1);
$result=f2($i);
imagesetpixel($im,$i+$x_left,$y_top+$y_height-$result,$graph_color2);
$result=f3($i);
imagesetpixel($im,$i+$x_left,$y_top+$y_height-$result,$graph_color3);
$result=f4($i);
imagesetpixel($im,$i+$x_left,$y_top+$y_height-$result,$graph_color4);
}

//Рисуем рамку графика.
imageline($im,0,0,$imgw-1,0,$axe_color);
imageline($im,$imgw-1,0,$imgw-1,$imgh-1,$axe_color);
imageline($im,$imgw-1,$imgh-1,0,$imgh-1,$axe_color);
imageline($im,0,$imgh-1,0,0,$axe_color);

//Сохраняем картину в файл.
$file="image.jpeg";
imagejpeg($im,$file);

echo("<p align=center><img src=$file></p>");

?>


Контрольное задание: создать баннер, выводящий информацию о количестве посещений странички, имеющий заливкой градиентную заливку со случайным начальным цветом, украшенный какой-либо картинкой либо частью картинки или нескольких картинок, смайликами и пр. У меня на форуме, например, стоит такой банер. Только без смайликов пока. >;) И с встроенным шрифтом. Но с каёмочкой...



P.$. Если Вы найдёте более интересные примеры по php_gd, то настоятельно прошу сообщить мне об этом для повышения общего, так сказать, образования.

Вечно Ваш ~=]DS[=~
(под редакцией ведущего рассылки)
admin@dsiss.fatal.ru
http://ds.823.pp.ru
ICQ: 256732889






  • Все вопросы, пожелания и предложения ведущему рассылки, прошу слать на e-mail: urisff@inbox.ru
  • Все статьи публикуются здесь только с разрешения (или рекомендации) автора.
  • Если вы хотите опубликовать здесь свою статью, то сделайте это, переслав её мне (желательно в виде html, причём без картинок).
  • В случае, если вы будете использовать приведённые в этой рассылке материалы, не забудьте сделать ссылку на эту рассылку.

  • Ведущий рассылки:
    Набатников Иван
    urisff@inbox.ru
    http://newff.narod.ru
    ICQ: 199434949


    http://subscribe.ru/
    http://subscribe.ru/feedback/
    Подписан адрес:
    Код этой рассылки: comp.soft.prog.urisprog
    Отписаться

    В избранное