Путь: >
Новичкам
Новичкам
Автор: - BigDaddy
Дата публикации - 21.5.2005
Просмотров: - 3520
Основи роботи з графічними функціями в РНР
[p]Що потрібно, щоб працювати з малюнками в РНР[/p]
[b]Під Лінуксом[/b]
Отже, для того, щоб Ви могли викоритовувати в своїх скриптах функції роботи з графікою, необхідно, щоб РНР було компільовано (вірніше, зконфігуровано) з опцією --with-gd. При цьому, якщо Ви ставите РНР версії нижче 4.3, Вам доведеться спочатку проінсталювати ГД пакет.
Скачати бібіліотеку можна тут: url=http://www.boutell.com/gd/]http://www.boutell.com/gd//url]
Якщо Ви плануєте створювати PNG малюнки, Вам знадобляться, також, бібліотека libpng та zlib. Ці бібліотеки можна знайти тут: url=http://www.libpng.org/pub/png/]http://www.libpng.org/pub/png//url] та url=http://www.info-zip.org/pub/infozip/zlib/]http://www.info-zip.org/pub/infozip/zlib//url] відповідно. Для роботи з JPEG форматом, доведеться поставити ще й jpeg-6b бібліотеку, яку беремо тут: url=http://www.ijg.org/ ]http://www.ijg.org/ /url]
Для того, щоб Ви мали можливість гарно писати на малюнках, знадобиться ще й FreeType 2.x бібліотека роботи з TrueType шрифтами. Взяти її можна тут: url=http://www.freetype.org/ ]http://www.freetype.org/ /url]
Ніби все. Усі ці бібліотеки необхідно проінсталювати до того, як почнеться інсталяція GD.
Інсталяція бібліотеки описана в INSTALL, але зупинимось коротко на основних моментах.
./configure (По замовчуванню, інсталяція відбувається в /usr/local/lib. Якщо Вас це не влаштовує, можна змінити кінцеву директорію: ./configure --prefix=/user/path)
make
make install
Після цього необхідно проінсталювати РНР (детально про це описано тут: url=http://php.ukrwave.com/faq.php?id=7]http://php.ukrwave.com/faq.php?id=7/url]). При цьому, до згаданих в статті параметрів конфігурування, потрібно додати --with-gd, а якщо ГД конфігурувалося як ./configure --prefix=/user/path
то потрібно вказувати --with-gd=/user/path
[b]Під Віндовс[/b]
Для РНР під віндовс активація графічних бібліотек є взагалі простою: необхідно відкрити файл php.ini, знайти рядок extension=php_gd.dll і пересвідчитись, що перед ним немає крапки з комою ";".
[p]Для чого потрібні графічні функції[/p]
Реально область використання графічних функцій в РНР є доволі обмеженою. Погодьтесь, ніхто не буде писати на РНР графічні редактори чи скрипти спектральної обробки зображень. Але все ж таки користь від наявності подібного сервісу величезна. Наведу лише кілька прикладів (кожен з читачів може доповнити своїм):
- Створення гарненьких лічильників - виведення інформації про кількість відвідувань сайту, про кількість користувачів на сайті і тд.
- Створення графіків - графічне представлення даних. З моєї, шалено суб"єктивної, точки зору, створення графіків є основним місцем застосування графічних функцій.
- Створення "антиботівських написів". Я маю на увазі виведення, скажімо на форумах, даних про користувачів (наприклад, e-mail) у вигляді малюнка, щоб усунути можливість зчитування цього напису яким-небуть спамерським скриптом з тексту сторінки - замість мейл-ту: на сторінці буде імдж срс=. (Правда, в цьому випадку доведеться самому писати функцію відправки пошти, але це вже інша історія)
- Змінення розміру малюнків та створення індексових малюнків (так звані thumbnails) для фотогалереї.
[p]З чого складається набір графічних функцій в РНР[/p]
Функції створення малюнка. Виклик цих функцій є обов"язковою передумовою будь-яких графічних маніпуляцій. Якщо ми вирішили "починати з нуля" (створювати малюнок на голому місці), нам підійде функція ImageCreate. У випадку, коли ми хочемо працювати з існуючим малюнком, необхідно вибрати відповідну функцію з ImageCreateFromGD2, ImageCreateFormGD, ImageCreateFromPng, ImageCreateFromJpeg і так далі.
[nb]
Бібліотеки ГД на сучасному етапі не підтримують формату GIF через комерційність патенту на алгоритми LZW компресії. Детальну інформацію з даного питання можна отримати на сайті GD: url=http://www.boutell.com/gd/]http://www.boutell.com/gd//url]
[/nb]
Для будь-якого креативу, себто малювання, необхідні фарби (поодинокі) або палітри. Створенням подібних речей займаються функції ImageColorAllocate, ImageColor... та ImagePaletteCopy.
Безпосередньо малювання здійснюється за допомогою функцій ImageArc, ImageLine, ImageEllipse, ImageFill та інші.
Виведення тексту на тло малюнка здійснюють ImageString, ImageStringUp, ImageTTFBBox, ImageTTFText, ImageFtBBox та їм подібні. (Про використання TTF шрифтів можна почитати тут: url=http://php.ukrwave.com/faq.php?id=8]http://php.ukrwave.com/faq.php?id=8/url])
Ну і нарешті, виведення малюнка в браузер чи в файл забезпечують функції ImagePng, ImageJPEG та подібні.
[code]
Якщо потрібно вивести створений малюнок в браузер, потрібно створити певні передумови для цього. З ХТМЛ ми знаємо, що включення малюнка в текст сторінки відбувається за допомогою тегів <img src=""> Далі, функції типу ImagePng без вказаного імені файлу виводять дані малюнка в стандартний потік, тобто прямо браузеру. Такий потік інформації потрібно "очолити" відповідним заголовком, що робиться за допомогою функції header("Content-type: image/png"); Тип малюнка необхідно поставити відповідний до того, якою функцією здійснюється вивід. Наприклад:
file.html:
.......
<img src="image.php">
........
image.php:
........
header ("Content-type: image/png");
ImagePng ($im);
.........
[/code]
[p]Практичні прийоми роботи з малюнками[/p]
Створення індексних малюнків (thumbnails) та приведення різноформатних малюнків "до спільного знаменника" для фотогалереї.
[code]
<?
//Допустимо, є скрипт, який дозволяє користувачу створити свою фотогалерею на нашому сайті. Цей скрипт передбачає створення індексних малюнків для виведення їх на сторінку попереднього перегляду (preview) та приведення розмірів малюнків до якогось стандарту (щоб користувач спокійно завантажував малюнок з розділенням 1600х1200, а в браузері всі бачили 800х600)
//Визначаємось з типом вхідного малюнка
if($type = @getimagesize($image)){//Дуже цікава функція, рекомендую почитати мануал по ній
switch ($type[2]) {
case 2: $im = imagecreatefromjpeg($image);
break;
case 3: $im = imagecreatefrompng($image);
break;
default: $is_thumb = false;
/*В цьому місці зроблю детальніший коментар. Отже, якщо Ви прочитали мануал по функції getimagesize, то Ви в курсі, що вона поверне масив, в якому міститься інформація про малюнки, збережені в форматі GIF, JPG, PNG, SWF, PSD, TIFF чи BMP. Якщо файл не є малюнком або формат його є невідомим, функція поверне NULL. В цьому місці ми визначаємо, чи формат малюнка підтримується нашим ГД (адже ми казали, що бібліотеку можна скомпілювати без підтримки PNG чи JPEG. Крім того, в старих версіях ГД є підтримка GIF). Отже, ми повинні чітко визначити, які формати малюнків ми будемо обробляти, а які ні.
*/
}
}else die("Not an image file or image type is not supported");//Файл не є малюнком.
if($im){
if($type[0]>$type[1])){
$ratio = $type[0]/$type[1];
//Наступна конструкція покликана сформувати однакового розміру малюнки, найбільша сторона малюнку буде завжди $small_side та $image_side. Друга сторона матиме відповідний розмір - пропорції зберігаються
if($ratio>1){
$thumb = imagecreate($small_side, $small_side/$ratio);
$new = imagecreate($image_side, $image_side/$ratio);
}
else{
$thumb = imagecreate($small_side*$ratio, $small_side);
$new = imagecreate($image_side*$ratio, $image_side);
}
//Копіюємо оригінальний малюнок в новостворений зі зміною розмірів
if(type[0]>$image_side ||type[1]>$image_side){
imagecopyresized($new, $im, 0,0,0,0,imagesx($new), imagesy($new),
$type[0], $type[1]);
imagejpeg($new, $path_to_galery.$file_name); //Не забудьте вказати ім"я файла
}
//Якщо розмір малюнка менший нашого стандарту, краще залишити його таким, яким він є.
else copy($image, $path_to_galery.$file_name);
//Фактично, робимо те саме, копіюємо в новостворений малюнок зі зміною розмірів
imagecopyresized($thumb, $im, 0, 0, 0, 0, imagesx($thumb), imagesy($thumb),
$type[0], $type[1]);
imagejpeg($thumb, $path_to_galery.$thumb_name);
imagedestroy($thumb);
imagedestroy($new);
imagedestroy($im);
}
?>
[/code]
Створення графіків
Тут, взагалі то, нічого сильно складного немає, одна суцільна арифметика. Але для досягнення повного розуміння, наведу повний код, навіть, якщо значна частина його не відноситься до власне роботи з графічними функціями.
Отже, задача. Є одномірний масив даних, необхідно вивести їх у графічній формі. Задача проста, але вона дасть (я сподіваюсь) загальне розуміння принципу побудови подібних скриптів, і в подальшому, кожен зможе працювати зі складнішими наборами даних чи будувати гарно оформлені графіки.
[code]
<?
//Нехай $data - одномірний масив з даними. Вважаємо, що кількість точок графіка є меншою, ніж розмір малюнка по горизонталі
//$x_size, $y_size - розміри малюнка
$x_size = 200;
$y_size = 100;
//
//Почнемо з осей координат. Вісь Y буде відступати від краю малюнку на $y_offset, вісь Х - $x_offset. Задаємо кількість позначок на обох осях - $y_ticks та $x_ticks. Ніби все. Якщо щось забули - додамо по ходу дії.
$x_offset = 10;
$y_offset = 10;
$x_ticks = 10;
$y_ticks = 10;
//Розраховуємо масштаб, а точніше крок між точками. По Х все наче зрозуміло - в точці 0 по Х буде стояти 1-а точка, на кінці Х буде стояти остання точка.
$x_step = ($x_size-2*$y_offset)/count($data);
//По Y трохи складніше - необхідно знайти максимальне та мінімальне значення даних в масиві.
$y_max = $data[0];
$y_min = $data[0];
$count = count($data);
for ($i=1;$i<$count;$i++){
if($y_max<$data[$i])$y_max = $data[$i];
if($y_min>$data[$i])$y_min = $data[$i];
}
$y_step = ($y_size - 2*$x_offset)/($y_max-$y_min);
//Готуємо палітру та малюнок
$im = @ImageCreate ($x_size, $y_size) or die ("Cannot Initialize new GD image stream");
$background_color = ImageColorAllocate ($im, 255, 255, 255);
$axes_color = ImageColorAllocate ($im, 233, 14, 91);
$ticks_color = ImageColorAllocate($im, 255, 0, 0);
$graph_color = ImageColorAllocate($im, 0, 0, 0);
ImageFill($im, 5, 5, $background_color);
//Малюємо вісь Х
ImageLine($im, $y_offset, $y_size - $x_offset, $x_size - $y_offset, $y_size - $x_offset, $axes_color);
//Малюємо вісь Y
ImageLine($im, $y_offset, $y_size - $x_offset, $y_offset, $y_offset, $axes_color);
//Визначаємо відстань між позначками по осі Х
$x_tick_step = ($x_size - 2*$y_offset)/($x_ticks+2);
//Малюємо позначки по осі Х
for ($i=1;$<=$x_ticks;$i++){
ImageLine($im, $y_offset + $i*$x_tick_step, $y_size - $x_offset, $y_offset + $i*$x_tick_step, $y_size - $x_offset - 5, $axis_color);
}
//Визначаємо відстань між позначками по осі Y
$y_tick_step = ($y_size - 2*$x_offset)/($y_ticks+1);
//Малюємо позначки по осі Y
for ($i=1;$i<=$x_ticks;$i++){
ImageLine($im, $x_offset - 2 , $y_size - $x_offset - $i*$y_tick_step, $x_offset + 5, $y_size - $x_offset - $i*$y_tick_step, $axes_color);
}
?>
[/code]
Обсудить в ФОРУМе - комментариев ()
Путь: >
Новичкам
Если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
|