Profruit banner

Умен звънец в openHAB

16 декември 2023

Телефонът е винаги с мен и сега, където и да се намирам получавам известие от openHAB, че някой е позвънил и чака пред вратата. А ако ме няма вкъщи става ясно часа и датата на последното позвъняване.

Tasmota Multipress

30 септември 2023

Идеята е Sonoff Touch T1 US 2 в салона, да управлява освен своето осветление и това в кухнята, а още вентилатора.

DIY 12V 1A WiFi Router UPS

22 април 2023

При поредно прекъсване на захранването вкъщи, батерията на нoтбука и двата UPS автоматично превключват на аварийно захранване и едновременно полита съобщение за конфуза

Zigbee2MQTT клониране

21 януари 2023

... как да клонираме съществуваща настройка на Zigbee2MQTT без да се налага последвало интервю на zigbee-устройствата.

LD2410 - бюджетен датчик присъствие в openHAB

11 февруари 2023

Цената на HLK-LD2410 зададе име на поредната тема в моя блог. С негова помощ се постига "народен" датчик присъствие в домашната автоматизация. . ...


PHP не е ограничен до писане на сух код и извеждането му в HTML поток. Развитието на език PHP към днешен ден предлага богат комплект от функции за динамическа генерация на графически примитиви и изображения, и работа с тях. PHP успешно създава и управлява различни формати изображения: GIF, PNG, JPG, WBMP, и XPM. Удобство е, че PHP извежда потока с изображения непосредствено в браузъра.

Едно от интересните неща е да поставяте водни знаци върху снимките с помощта на графическа библиотека GD.

1

Изходен материал


снимка, която ще защитим с воден знак:
изходен материал




воден знак:
изходен материал

2

Инсталация на GD библиотека в Ubuntu


Инсталация на GD библиотека в Ubuntu се свежда до един ред команда:
sudo apt-get install php5-gd -y

-y в края на командата означава, че вие превантивно се съгласявате след изтегляне на пакета да бъде инсталиран веднага. Пестене на време, на излишни телодвижения и пагубна мозъчна активност.

При ОК рескаме сървъра, за да му стане ясно, че сме му закачили нови дрънкулки.
Нежно, с перце:
sudo /etc/init.d/apache2 reload

Грубо, с теслата по главата:
sudo service apache2 restart

Вдигаме функция:
<?=phpinfo() ?>

или на по-пряко тази функция:
<pre>
<?php print_r(gd_info()); ?>
</pre>

и се наслаждаваме на резултат: GD Support enabled
съответно: [GD Version] => 2.0

Тук имате позволението, да захапете една дърта хаванска пура.
Ако се наблюдава проблемация и библиотеката не баца, то се гмуркаме като делфин в PHP.INI.
sudo gedit /etc/php5/apache2/php.ini

и добавяме ред в секция Dynamic Extensions
extension=gd.so

Windows-потребителите трябва дa добавят файл php_gd.dll.
Този файл се копира в папка %WINDIR%\SYSTEM. След което, да добавят в php.ini следния ред: extension=php_gd.dll


Рескаме пак индианеца и трябва да е гуд, в противен случай отиваме на врачка, да развали черната магия.

3

PHP воден знак върху снимка


<?php
 //проверка за GD библиотека
 if (!extension_loaded('gd') && !function_exists('gd_info')) {
    exit("нямате инсталирана GD библиотека");
 }

 //изходен материал
 $img = "picture.jpg";
 $stamp = imagecreatefrompng('warning.png');

 //получаваме масив $type (до точката и след нея)
 $type = explode(".", $img);

 //получаваме разширението
 $ext = strtolower($type[sizeof($type)-1]);

 //сито на разширението, при false задаваме jpeg
 $ext = (!in_array($ext, array("jpeg","png","gif"))) ? "jpeg" : $ext;

 //генерираме функция imagecreatefrom...() в полет, чрез конкатенация
 $function = "imagecreatefrom".$ext;
 $picture = $function($img);

 //задаваме отсъпи на печата
 $marge_right = 10;
 $marge_bottom = 10;

 //определяме ширина и височина на водния знак
 //$size = getimagesize($stamp);
 //$sx = $size[0];
 //$sy = $size[1];
 $sx = imagesx($stamp);
 $sy = imagesy($stamp);

 //копираме печата върху изображението, тук става голямата работа
 imagecopy($picture, $stamp, imagesx($picture) - $sx - $marge_right, imagesy($picture) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));

 // печатане
 header('Content-type: image/'.$ext);
 $function = "image".$ext;
 $function($picture);

 //освобождаване на памет
 imagedestroy($picture);
 imagedestroy($stamp);
В началото превантивно проверяваме за наличие на библиотека GD. При неуспех - плюем съобщение и излизаме, иначе продължаваме.

Интерес е местоположението на изходния материал. Пиктограмата за воден знак е твърдо зададена. Функция imagecreatefrompng() изисква .PNG формат.
Защитаваната снимка може да се намира навсякъде в буквалния смисъл. Абсолютен, относителен път, дори URL може да се обяви. PHP е умен език и ще включи снимката от посочения адрес.

Функция explode() ще върне масив. За разделител ползваме точката (.). Масива закачаме на променлива $type. Идеята е да извлечем разширението на изображението.

Функция sizeof() е еквивалент на функция count(). Тази функция ще преброи членовете на масива. Ключовете на този масив са поредица от числа и спокойно можем да го наречем списък, а самите ключове - индекси. Последен индекс притежава като значение името на разширението и то е наша цел. Вадим от общия брой единица и получаваме индекс с разширението.
Функция strtolower() ще преведе в долен регистър символите, в случай на главни букви. Главните букви стават малки.

Следва тернарен оператор. Един от параметрите е масив с допустими разширения, а другия е текущото разширение. При несъвпадение задаваме твърдо jpeg, иначе каквото дошло.

Следва поредна сладка част. Генерираме функция в полет, без да се интересуваме за конкретна. На помощ идва конкатенация.

Задаваме отсъпи на печата. Определяме ширина и височина на водния знак.

Копираме печата върху изображението, тук става голямата работа. На помощ документацията на PHP.

Съобщаваме на браузъра, че идва изображение с конкретен формат. Отново сглобяваме функция в полет, чрез конкатенация и предаваме снимката.

Унищожаваме снимката и водния знак, за да освободим заетата памет.

4

Резултат


Blogger не позволява изпълнението на PHP код. Копирайте кода в php файл. Качете го в директорията на Apache и от браузър стартирайте файла. Ако копирате адресите на снимките в началото и ги замените в нужните места на скрипта, ще получите тази снимка.

php воден знак на снимка

Новото което научаваме е защитената снимка е непокътната. Tя може да се намира навсякъде и дори зад пределите на root директорията на Apache.

Защитената снимка създаваме от оригинала и по-точно зареждаме от оригинала. Тя обаче придобива име самото на php-сценария, например marked.php.

На свой ред това дава възможност в произволно място на вашия HTML документ да обявявате за адрес на снимка самия php сценарий:
<img src=marked.php alt="" />

В края на адресното поле на браузъра никъде не четем png, jpeg и т.н. Това разширение се разбира едва, когато решим да съхраним снимката на твърдия диск на нашата система и получаваме подобно marked.php.jpeg.





до нови срещи   ^.^

11.11.2011 profruit 

|

0 Response to "PHP воден знак върху снимка"

Публикуване на коментар

Този блог е реинкарнация на първите ми опити за споделяне в нета. На времето започнах с къси разкази на преживяното. После се обезсмисли и превърнах блога си в системно радио. Пиша единствено неща, които карат душата ми да живее: openHAB, Ubuntu, Споделено и т.н. Това е моето системно радио, разбирате ли? Моята вълна и вие сте на нея сега.

Архив на блога