Практика » Малюємо в PHP - GD для початківців


17 листопада 2010 від admin
Колись, описуючи тег hr я звернув увагу, що це єдиний тег в html, який хоч щось малює. І дійсно, в html вся графіка не малюється а вставляється за допомогою зовнішніх об'єктів. Колись давно, коли сервери були великими а процесори у них були слабенькими PHP теж не вмів малювати - адже він створювався для роботи з текстом. Проте сьогодні зросли як потужності серверів, так і потреби користувачів. Як приклад динамічно згенерованих зображень можу навести всім відому CAPTCHA. Або водяні знаки для картинок - так звані wotermark. Або динамічні юзербари для форумів. Або... а давайте напишемо невеликий скрипт, який нам послужить і уроком і прикладом одночасно?

Спершу познайомимся з теоретичними знаннями. Припустимо у нас є якийсь сайт, на якому відвідувачі можуть реєструватися і вказувати свої контактні дані (телефон, e-mail, ICQ, тощо). І ми хочемо захистити наших відвідувачів від спамерів. Адже як спамери збирають свої бази? Спамер запускає спеціальний скрипт (парсер), який шукає на сайті всі комбінації символів, серед яких є знак @. Завдання парсера - знайти все, що потрапляє під формулу ***@***.*** (замість зірочок можуть бути любі символи) - це і буде адреса електронної пошти. Спочатку від подібних парсерів захищалися, замінюючи в електронній адресі символ @ на щось інше, наприклад (a) або (at) - можливо ви зустрічали подібні "замасковані" e-mail. Але розробники парсерів не сидять на місці - адже "пояснити" скрипту що ціль парсинга замість @ може містити (a) або (at) не дуже складно.

Але якщо замість комбінації символів ***@***.*** буде зображення, то парсер не прийме його за адресу електронної пошти. Подивіться живий приклад у дії - спробуйте ввести google.com.ua і подивіться його дані. Зверніть увагу на значення e-mail. Це картинка, яку легко прочитає людина але яку пропустить програма-парсер. Давайте зробимо щось подібне собі.

З теорією розібралися, із завданням визначилися - тепер саме час приступити до практики. Для початку нам доведеться переконатися що на сервері встановлена бібліотека GD - саме вона нам знадобиться для "малювання". Впишіть в який-небудь файл

<?php
phpinfo
();
?>
Перед вами з'явиться інформація про PHP - версія, встановлені розширення і т.д. Якщо ви увидіти GD Support enabled значить все в порядку. Давайте створимо файл str2img.php, в який запишемо наступний код (щоб було всім зрозуміло, кожен рядок містить коментар):

$mystr = $_GET["mystr"];// Змінна $ mystr буде містити значення, яке ми передамо в файл
$im = imagecreate (220, 16); // Створимо малюнок 220 на 16 пікселів
$bg = imagecolorallocate ($im, 245, 245, 245); // Задамо колір заднього фону (255 - білий, 0 - чорний)
 
for ($i = 0; $i < strlen($mystr); $i++) { // Запустимо цикл, що виконається стільки разів скільки символів містить наше слово
    $color = imagecolorallocate ($im, 0, 0, 0); // Задамо колір для символів (255 - білий, 0 - чорний)
    $x = 8+$i * 8; // Кожен новий символ намалюємо на 8 пікселів правіше
    $y = 0; // Оскільки пишемо в один рядок, горизонтальні координати = 0
    imagechar($im, 2, $x, $y, $mystr[$i], $color); 

 
header("Content-type: image/png"); 
echo imagepng($im); // Показуємо намальоване
imagedestroy($im); // Звільняємо пам'ять

Даний файл намалює нам все, що ми йому передамо методом GET, ось приклад:

<img src="str2img.php?mystr=hosting from webamator.net" />

Замість фрази hosting from webamator.net можете передавати потрібне значення - наприклад, як і було сказано спочатку, адреси електронної пошти, які будуть "заховані" від парсерів. Можете подивитися діючий приклад даного скрипта.