Статьи

Сервіс для нанесення водяного знаку своїми руками на PHP

На роботі виникала необхідність нанесення водяного знаку на технічне свідоцтво. Водяний знак був зазвичай 4-5 рядків тексту.

На початку я це завдання робив зазвичай за допомогою графічної програми Photoshop. Однак з часом набридло виконувати це завдання в ручну і прийшла ідея написати готовий скрипт на PHP (тим більше проблем з розгортанням сервера не було, тому що для розробки вже використовувався локальний сервер). Завдання написання скрипта виявилося простий і не складною. Отже, приступимо.

На початку необхідно створити ось таку структуру папок і файлів на вашому локальному сервері:

В папці fonts ми зручно помістили шрифт, який використовується для написання тексту водяного знака. Я використовував шрифт Moscow Sans Regular . Ви ж можете скористатися будь-яким своїм шрифтом.

Папка output необхідна для автоматичного створення в ній зображень з накладеним водяним знаком на кожне з них.

Папка source необхідна для наших вихідних зображень, на які буде накладатися водяний знак. До речі, я для свого завдання використовував 17 зображень, які представляють відскановані сторінки формату А4. Природно можна помісити в неї як одне зображення, так хоч сотню. Просто увелічеть час виконання скрипта. Однак, не рекомендую занадто велика кількість файлів.

У файлі index.php ми розмістимо нашу форму, на якій буде можливість змінювати текст водяного знака, а також керувати розміром шрифту і кутом нахилу водяного знака.

Розмір шрифту і кут нахилу вже налаштовані оптимально. Ще після накладення знака значення рядків зберігаються в сесію. Якщо хочете повернути значення за замовчуванням, то необхідно натиснути на кнопку «Скинути значення». За замовчуванням значення рядків заповнені деяким текстом, який можна змінити у файлі index.php.

У файлі create.php розмістимо сам код для накладення водяного знака на наші вихідні зображення. У разі успіху буде зроблено перенаправлення на index.php і виведення повідомлення про успіх.

Для оформлення я використовував css-фреймворк bootstrap і власний файл css-стилів.

файл style.css

body {background-color: # 222; color: #fff; } Input [type = text] {border-radius: 0; width: 400px! important; } Button.btn {border-radius: 0; } Div.alert-success {margin-top: 10px; border-radius: 0; width: 400px; } .Width100p {width: 100%! Important; } .Noresize {resize: none; border-radius: 0; }

файл index.php

<? Php session_start (); $ Text = [ 'Технічне свідоцтво і Технічна оцінка', 'видані: ТОВ "Організація"', 'об'єкт: ТОВ "Назва об'єкта"', 'за адресою: м Назва, вул. Назва, д. 1 ']; ?> <! Doctype html> <html lang = "en"> <head> <meta charset = "UTF-8"> <title> Водяний знак для тих. свідоцтва </ title> <link rel = "stylesheet" href = "../ css / bootstrap.min.css" /> <link rel = "stylesheet" href = "../ css / style.css" /> < / head> <body> <div class = "container"> <div class = "row"> <div class = "col-sm-12"> <br> <a href = "/" class = "btn btn- default "> Назад </a> </ div> </ div> <div class =" row "> <div class =" col-sm-12 "> <h3> Дані для водяного знака </ h3&gt; <? if ($ _GET [ 'result'] == 'success') {?> <div class = "alert alert-success" role = "alert"> Водяний знак успішно накладено. &lt;/ div&gt; <?}?&gt; <? if (! isset ($ _ GET [ 'result']) && $ _GET [ 'result']! = 'success') {unset ($ _ SESSION [ 'text']); }?> <Form method = "post" action = "create.php"> <div class = "form-group"> <label> Рядок 1 </ label> <input type = "text" name = "text [] "class =" form-control "value =" <? = isset ($ _ SESSION [ 'text'])? htmlspecialchars ($ _ SESSION [ 'text'] [0]): htmlspecialchars ($ text [0])?> " > </ div> <div class = "form-group"> <label> Рядок 2 </ label> <input type = "text" name = "text []" class = "form-control" value = "<? = isset ($ _ SESSION [ 'text'])? htmlspecialchars ($ _ SESSION [ 'text'] [1]): htmlspecialchars ($ text [1])?> "> </ div> <div class =" form-group "> <label> Рядок 3 </ label> <input type =" text "name =" text [] "class =" form-control "value =" <? = isset ($ _ SESSION [ 'text'])? htmlspecialchars ($ _SESSION [ 'text'] [2]): htmlspecialchars ($ text [2])?> "> </ div> <div class =" form-group "> <label> Рядок 4 </ label> <input type = "text" name = "text []" class = "form-control" value = "<? = isset ($ _ SESSION [ 'text'])? htmlspecialchars ($ _ SESSION [ 'text'] [3]): htmlspecialchars ($ text [3])?> "> </ div> <div class =" form-group "> <label> Рядок 5 </ Label> <input type = "text" name = "text []" class = "form-control" value = "<? = Isset ($ _ SESSION [ 'text'])? htmlspecialchars ($ _ SESSION [ 'text'] [4]): htmlspecialchars ($ text [4])?> "> </ div> <div class =" form-group "> <label> Розмір шрифту </ label> < input type = "text" name = "sizeFont" class = "form-control" value = "54" style = "width: 60px! important;"> </ div> <div class = "form-group"> <label > Кут нахилу вод. знака </ label> <input type = "text" name = "angleText" class = "form-control" value = "30" style = "width: 60px! important;"> </ div> < button type = "submit" class = "btn btn-success"> Накласти водяний знак </ button&gt; <? if (isset ($ _ SESSION [ 'text'])) {?> <a href = "/ watermark /" class = "btn btn-warning"> Скинути значення </a&gt; <?}?> </ form> </ div> </ div> </ div> </ body> </ html>

Особливих коментарів з даного коду не стану робити. Все тож досить просто і зрозуміло. Змінна $ text є масивом всіх рядків для водяного знака, тобто кожна нова рядок - це новий елемент масиву $ text.

А ось і сам цікавіший файл create.php.

<? Php session_start (); / ** * Створення водяного знака * / if ($ _POST) {$ arrText = array_diff ($ _ POST [ 'text'], [ '']); // З масиву відсіюємо порожні рядки $ sizeFont = (int) $ _ POST [ 'sizeFont']; $ AngleText = (int) $ _ POST [ 'angleText']; $ FontPath = dirname (__ FILE__). '/Fonts/MoscowSansRegular.ttf'; $ SourcePath = dirname (__ FILE__). '/ Source /'; $ OutputPath = dirname (__ FILE__). '/ Output /'; / ** * @param $ img Ідентифікатор зображення, на яке додається водяний знак * @param $ text Текст напису * @param $ font Файл шрифту .ttf * @param int $ r Колір напису в форматі RGB * @param int $ g колір напису в форматі RGB * @param int $ b колір напису в форматі RGB * @param int $ alpha Рівень прозорості від 0 до 128 * @return mixed * / function addWatermark ($ img, $ text, $ font, $ r = 128 , $ g = 128, $ b = 128, $ alpha = 100) {if (! is_array ($ text)) return false; $ Width = imagesx ($ img); $ Height = imagesy ($ img); $ Angle = 30; $ C = imagecolorallocatealpha ($ img, $ r, $ g, $ b, $ alpha); $ Size = 54; $ Offset = 100; // Зсув між рядками для осі Y // Нанесення тексту з масиву зі зміщенням по осі Y for ($ i = 0; $ i <count ($ text); $ i ++) {$ box = imagettfbbox ($ size, $ angle, $ font, $ text [$ i]); $ X = $ width / 2 - abs ($ box [4] - $ box [0]) / 2; $ Y = ($ height / 2 + abs ($ box [5] - $ box [1]) / 2) + $ offset * $ i; imagettftext ($ img, $ size, $ angle, $ x, $ y, $ c, $ font, $ text [$ i]); } Return $ img; } $ AllFilenames = glob ($ sourcePath. '* .Jpg'); $ CountFiles = count ($ allFilenames); for ($ i = 0; $ i <$ countFiles; $ i ++) {$ img = imagecreatefromjpeg ($ allFilenames [$ i]); $ Image = addWatermark ($ img, $ arrText, $ fontPath, 72, 72, 72, 60); imageJPEG ($ image, $ outputPath. basename ($ allFilenames [$ i])); imagedestroy ($ image); } $ _SESSION [ 'text'] = $ arrText; header ( 'Location: / watermark /? result = success'); }

Код максимально забезпечений коментарями, що зробить його розуміння більш простим.

Увага. Для правильної роботи необхідно додати шрифт в папку fonts і змінити його ім'я в змінної $ fontPath. В папку source необхідно додати хоча б одне вихідне зображення (враховуються тільки файли з розширенням JPG).

Ще одна позначка - всі файли я мав в окремій папці watermark. Якщо будите міняти папку, то слід враховувати шляху в коді.

Таким чином, за короткий проміжок часу накидав невеликий корисний скрипт, який заощадить час при створенні водяного знака в кілька рядків.

Звичайно, ви можете змінити скрипт під свої потреби або доопрацювати його так як вам необхідно.

Дякуємо за увагу. Якщо виникли питання, пишіть.

If ($ _GET [ 'result'] == 'success') {?
Lt;/ div> <?
Gt; <?
Success') {unset ($ _ SESSION [ 'text']); }?
Isset ($ _ SESSION [ 'text'])?
Htmlspecialchars ($ _ SESSION [ 'text'] [0]): htmlspecialchars ($ text [0])?
Isset ($ _ SESSION [ 'text'])?

Новости