Статьи

Сервіс для нанесення водяного знаку своїми руками на 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'])?

Новости

Как создать фото из видео
Кризис заставляет искать дополнительные источники дохода. Одним из таких источников может стать торговля на валютном рынке Форекс. Но чтобы не потерять свои деньги необходимо работать с надежным брокером.

Как оформить группу в вконтакте видео
Дано хотел свой магазин в вк, но не знал с чего начать его делать. Так как хотелось не банальный магазин с кучей ссылок и фото, а красиво оформленный. С меню, с аватаркой. После просмотра видео создал

Как оформить диск малыш от рождения до года из фото и видео
Оформить диск "Малыш от рождения до года" из фото и видео можно совершенно разными способами! Кто-то для достижения данной цели идет на шоу-таланты, кто-то пользуется услугами профессионалов, а кто-то