Малюємо в PHP - GD для початківців
Опубліковано admin-ом 17 листопада 2010 в категорії Практика
Колись, описуючи тег hr я звернув увагу, що це єдиний тег в html, який хоч щось малює. І дійсно, в html вся графіка не малюється а вставляється за допомогою зовнішніх об'єктів. Колись давно, коли сервери були великими а процесори у них були слабенькими PHP теж не вмів малювати - адже він створювався для роботи з текстом. Проте сьогодні зросли як потужності серверів, так і потреби користувачів. Як приклад динамічно згенерованих зображень можу навести всім відому CAPTCHA. Або водяні знаки для картинок - так звані wotermark. Або динамічні юзербари для форумів. Або... а давайте напишемо невеликий скрипт, який нам послужить і уроком і прикладом одночасно?
Спершу познайомимся з теоретичними знаннями. Припустимо у нас є якийсь сайт, на якому відвідувачі можуть реєструватися і вказувати свої контактні дані (телефон, e-mail, ICQ, тощо). І ми хочемо захистити наших відвідувачів від спамерів. Адже як спамери збирають свої бази? Спамер запускає спеціальний скрипт (парсер), який шукає на сайті всі комбінації символів, серед яких є знак @. Завдання парсера - знайти все, що потрапляє під формулу ***@***.*** (замість зірочок можуть бути любі символи) - це і буде адреса електронної пошти. Спочатку від подібних парсерів захищалися, замінюючи в електронній адресі символ @ на щось інше, наприклад (a) або (at) - можливо ви зустрічали подібні "замасковані" e-mail. Але розробники парсерів не сидять на місці - адже "пояснити" скрипту що ціль парсинга замість @ може містити (a) або (at) не дуже складно.
Але якщо замість комбінації символів ***@***.*** буде зображення, то парсер не прийме його за адресу електронної пошти. Подивіться живий приклад у дії - спробуйте ввести google.com.ua і подивіться його дані. Зверніть увагу на значення e-mail. Це картинка, яку легко прочитає людина але яку пропустить програма-парсер. Давайте зробимо щось подібне собі.
З теорією розібралися, із завданням визначилися - тепер саме час приступити до практики. Для початку нам доведеться переконатися що на сервері встановлена бібліотека GD - саме вона нам знадобиться для "малювання". Впишіть в який-небудь файл
<?php
phpinfo();
?>
$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 можете передавати потрібне значення - наприклад, як і було сказано спочатку, адреси електронної пошти, які будуть "заховані" від парсерів. Можете подивитися діючий приклад даного скрипта.

Версія для друку