Створення водяних знаків за допомогою php

вступ

На даному етапі свеого розвитку PHP пропонує програмістам широкий набір функцій для динамічної генерації зображення і роботи з ними. У цій статті я покажу методику створення класу, який буде ставити водяні знаки на ці самі зображення. Цей клас буде працювати з двома зображеннями: поточна й водяний знак. Як доповнення, введений ще третій параметр - наш клас буде містити альфа-змінну. Це дозволить використовувати для нашого водяного знака альфа-канал.

Для довідки

Інформація, що знаходиться в альфа-каналі найчастіше представляє виділені області - деякі форми або розташування кольорових областей. Збереження альфа-каналу в зображенні збільшує розмір файлу на 1/3. RGB зображення можуть мати до 24 альфа-каналів. Точкові і індексовані зображення не можуть містити альфа-каналів.

Частина перша - основи

Перед тим, як почати написання самого класу, розглянемо функції, які будуть в ньому використовуватися. Ось їх список:

Як можна побачити, у php досить функцій для роботи з графікою. Нехай призначення деяких з них і не зовсім зрозуміло в теорії, але на практиці все гараздо простіше. Тому, щоб розібратися, як з ними працювати, можна застосувати їх в нашому класі.

Вибір шляху до мети

Зараз, коли ми вже визначилися з метою нашого "міні-проекту", трохи повернемося назад і поговоримо про способи її втілення.

Для початку, наше додаток отримує два зображення - вихідне зображення і сам водяний знак. Далі нам необхідно визначити розміри цих зображень (width-ширину і height-висоту). Ці дані нам необхідні для розташування водяного знака в центрі зображення (виходячи з припущення, що розмір водяного знаку буде менше самого малюнка).

Потім потрібно буде накласти наш водяний знак на вихідне зображення. Для цього нам буде потрібно скласти кольору (математично) накладених зображень для отримання третього.

І в підсумку, нам потрібно буде відобразити отримане зображення в браузері. В даному випадку малюнок буде відкриватися безпосередньо з джерела, зазначеного в тезі ""

Думаю, теорії вже досить - ключові моменти в ній розкрито досить докладно. Тепер перейдемо безпосередньо до написання скрипта.

Частина друга - пишемо скрипт

Почнемо з найпростішого - напишемо клас, який створює файл з водяним знаком. Назвемо його "watermark" і пропишемо його код в файлі "api.watermark.php". "Кістяком" класу буде три функції:

Наступним етапом буде написання коду функцій класу "watermark". Доповнюємо файл "api.watermark.php" такими рядками коду:

Тепер докладніше розглянемо функцію create_watermark ().

Насамперед ми передаємо їй три параметра:

(Важливо відзначити, що наша функція приймає зображення як об'єкти, а не просто як шляху до них - але про це буде сказано трохи пізніше)

Далі ми нам необхідно отримати інформацію про кожному із зображень. Нам це необхідно знати координати X і Y для розташування водяного знака в центрі вихідного зображення.

Наступним етапом буде створення нового, true-color зображення з тими ж розмірами, як і у вихідній картинки. Це зображення (змінна $ return_img) буде використано для об'єднання інформації з вихідних картинок (рисунок і водяний знак).

Фіналом буде відображення нашого модифікованого зображення в веб-сторінці, яка його запросить. Далі розглянемо решту дві допоміжні функції.

Частина третя - допоміжні функції

Крім функції create_watermark в нашому класі watermark присутні ще дві функції. Продовжимо вихідний код класу такими рядками:

А тепер докладніше. Наша перша функція "_get_ave_color" приймає чисельні величини двох кольорів і альфа-каналу. Повертає ж вона усереднену їх величину. Ця функція нам необхідна для визначення кольору, який вийде при накладенні пікселів двох малюнків.

Друга функція "_get_image_color" розбиває зображення на red (червоний), green (зелений) і синій (blue) складові (rgb-палітра). За допомогою вбудованих в php функцій для роботи з графікою (їх опис було на початку статті) отримуємо найближче значення кольору для нового зображення.

На додаток ще перевіряється кілька моментів. По-перше, якщо вдалося отримати точне значення (змінна $ c), то воно і повертається з функції (return $ c). В іншому випадку дала спроба підібрати колір за допомогою функції imagecolorallocate (). Якщо ж і це не допоможе досягти результату, то за допомогою функції imagecolorclosest () просто повертається найближче значення кольору (саме неточне).

Насамперед наш скрипт виконує обхід зображення за допомогою двох циклів 'for'. Паралельно ще підраховуються координати кожного пікселя водяного знака.

Далі проводиться пошук інформації про RGB для кожного пікселя. Якщо поточний піксель не перебувати в області перетину вихідного зображення і водяного знака, то наш клас лише дублює піксель для нового зображення. У разі розташування пікселя в області перетину, нам необхідно визначити його колір як результат накладення вихідного малюнка і водяного знака.

Для визначення кольору області перетину, спочатку потрібно отримати значення RGB-змінної водяного знака, використовуючи інформацію, яку ми отримали в циклах 'for'. Потім за допомогою функції «_get_ave_color" визначається середнє значення кольору для нового зображення. Далі слід функція "_get_image_color" для визначення колірної гами, яка буде використана функцією "return_img".

У підсумку, після завершення роботи циклів 'for' у нас є готове зображення з водяним знаком.

А тепер перевіримо наш клас в справі.

Частина четверта - тест-драйв

Для початку нам будуть потрібні два файли. Перший назвемо "watermark_test.php" і розмістимо в ньому наступний код:

Призначення цього файлу дуже просте: він відображає в браузері вихідне (main.jpg) і отримане (watermark.png, з водяним знаком) зображення.

Другий файл назвемо "image.php" і і розмістимо в ньому наступний код:

Ну ось і підібралися до фіналу.

Для тих, хто хоче отримати більше інформації про створення зображень в популярних форматах, даю кілька посилань:

Щоб протестувати наш скрипт, просто запустіть в браузері файл "watermark_test.php". Як результат, має бути два зображення - вихідне і з водяним знаком.

І на закінчення

Схожі статті