|
Można się czasami spotkać w sieci z galeriami, które do swoich zbiorów dodają znak wodny. Mówiąc o takim znaku mam na myśli napis lub jakieś logo w którymś z rogów pliku graficznego. W poniższym tekście postaram się wytłumaczyć jak zrobić coś takiego w php.
Jedyną rzeczą, jaka jest nam potrzebna jest moduł GD. Wbrew pozorom jest to bardzo proste, i opanowanie tego powinno Wam zajęć nie więcej niż kilkanaście minut.
Do tego wszytkiego będzie nam potrzebny tylko kilka funkcji. Oto one:
imagecreatefrom*( $sciezka ) - do otwarcia pliku końcówki jpeg, gif lub png
imagesx( $image ) - szerokość pliku
imagesy( $image ) - wysokość pliku
imagecopy() - główna funkcja operująca
Pierwsza z omawianych funkcji jest uzależniona od typu pliku jaki używamy i może to być imagecreatefromjpeg bądĽ imagecreatefromgif lub imagecreatefrompng. Teraz trzeba stworzyć odpowienią funkcję.
<?php
$znaczek = "images/znak.gif";
$pozycja = "tl"; // lewy górny róg
$pozycja = "tr"; // prawy górny róg
$pozycja = "bl"; // lewy dolny róg
$pozycja = "br"; // prawy dolny róg
function znaczek($plik,$pozycja)
{
global $znaczek;
$image1 = imagecreatefromgif( $znaczek ); // importujemy plik gif ze znakiem
$image2 = imagecreatefromjpeg( $plik ); // otwieramy plik jpg, na którym ma być naklejony znaczek
$plik_w = imagesx( $image2 ); // szerokość pliku
$plik_h = imagesy( $image2 ); // wysokość pliku
$znaczek_w = imagesx( $image1 ); // szerokość znaczka
$znaczek_h = imagesy( $image1 ); // wysokość znaczka
if( $pozycja == "tl" )
{
$od_x = 0;
$od_y = 0;
}
if( $pozycja == "tr" )
{
$od_x = $plik_w - $znaczek_w;
$od_y = 0;
}
if( $pozycja == "bl" )
{
$od_x = 0;
$od_y = $plik_h - $znaczek_h;
}
if( $pozycja == "br" )
{
$od_x = $plik_w - $znaczek_w;
$od_y = $plik_h - $znaczek_h;
}
imagecopy( $image2, $image1, $od_x, $od_y, 0, 0, $znaczek_w, $znaczek_h );
imagejpeg( $image2 );
imagedestroy( $image1 );
imagedestroy( $image2 );
}
header( "Content-type: image/jpg" );
znaczek("images/tp/tapeta.jpg","br");
?>
Gdyby nie opcja wybierania pozycji znaku funkcja wyglądałaby bardzo skromnie, ale byłaby mniej funkcjonalna ;). Zmienne $od_x i $od_y to punkty, od których ma być wklejony znak.
Troszkę dziwna jest składnia funkcji imagecopy, ale myślę że da się do niej przyzwyczaić ;). Mianowicie przekazaliśmy do funkcji następujące atrybuty:
imagecopy( $image2, $image1, $od_x, $od_y, 0, 0, $znaczek_w, $znaczek_h );
$image2 - jest to obazek, na który ma być wklejony drugi plik ( $image1 ). Obrazek zostanie umieszczony w punktach $od_x i $od_y. Kolejna para atrybutów - 0 i 0 - $znaczek_w i $znaczek_h - są to rozmiary pliku, który ma być wklejony. Podając takie atrybuty, jak wyżej skopiujemy cały znaczek.
Pozostaje nam jeszcze odpowienio skonfigurować serwer - tak aby nie pozwalał na otwieranie plików graficznych ani katalogu z naszą galerią. Zależnie od konfiguracji serwera możemy umieścić odpowiednie dane w pliku .htaccess lub httpd.conf - w jednym i drugim przypadku będzie wyglądać to tak samo.
<Directory ["sciezka/do/galerii/"]>
Deny from all
<Files ~ "^\.(jpg|gif|png)">
Deny from all
</Files>
</Directory>
Jak widzicie macie folder, w którym znajdują się obrazki. Oglądanie go z poziomu przeglądarki jest zabronione, podobnie jak i obrazków. Serwer nawet nie zastanawia się, co zrobić, gdy tylko zostanie wysłane żądanie do pliku gif, jpg bądĽ png wywala ostrzeżenie o braku dostępu. Pamiętajcie - gdy używacie plików htaccess nie musicie wpisywać pełnej scieżki. Wystarczy umieścić plik w katalogu nadrzędnym do galerii i wpisać <Directory "obrazki/">. Jeżli plik leży między grafikami nie wpisujcie ścieżki - zostawcie samo <Directory>.
Jeżeli wasz host pozwala umieścić jakieś pliki ponad katalogiem strony (czyli po zalogowaniu na ftp macie katalog np. www, w którym są dopiero pliki waszej witryny) to nie musicie się babrać w plikach .htaccess .
Mam nadzieję, że nieco wyjaśniłem Wam istotę sprawy drodzy czytelnicy. Przy okazji zahaczyliśmy o konfigurację serwera, no po prostu cudnie ;). Miłego znaczkowania! |