Forum graficzne Burning-Brushes.pl

Tutoriale graficzne i materialy => Pozostałe tutoriale => Tutoriale PHP/MySQL => Wątek zaczęty przez: Kaczy w Styczeń 29, 2011, 15:03:54

Tytuł: Znak wodny w PHP
Wiadomość wysłana przez: Kaczy w Styczeń 29, 2011, 15:03:54
Nie lubicie jak ktoś kradnie z waszego serwisu obrazki? A pojedyncze edytowanie obrazków jest męczące? Jest na to rada! Opiszę tu jak zrobić bardzo prosty znak wodny ;)

Najpierw musimy wiedzieć jakie są oznaczenia pozycji, w których może się znajdować znak wodny:
lg - lewy górny róg
pg - prawy górny róg
ld - lewy dolny róg
pd - prawy dolny róg

Następnie tworzymy plik znak.php:


<?php
$znaczek = "adres do obrazka znaku wodnego, koniecznie gif";
function znaczek($plik,$pozycja)
{
global $znaczek;

$image1 = imagecreatefromgif( $znaczek ); // importujemy plik gif ze znakiem
$nazwa_pliku = $_GET['obraz'];

$rozszerzenie = strtolower(substr($nazwa_pliku,strrpos($nazwa_pliku,".")+1));
if ($rozszerzenie == 'jpg') $image2 = imagecreatefromjpeg( $plik ); // otwieramy plik jpg, na którym ma być naklejony znaczek
else if ($rozszerzenie == 'gif') $image2 = imagecreatefromgif( $plik );
else if ($rozszerzenie == 'png') $image2 = imagecreatefrompng( $plik );
$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 == "lg" )
{
$od_x = 0;
$od_y = 0;
}
if( $pozycja == "pg" )
{
$od_x = $plik_w - $znaczek_w;
$od_y = 0;
}
if( $pozycja == "ld" )
{
$od_x = 0;
$od_y = $plik_h - $znaczek_h;
}
if( $pozycja == "pd" )
{
$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 );
imagegif( $image2 );
imagedestroy( $image1 );
imagedestroy( $image2 );

}

$nazwa_pliku = $_GET['obraz'];

$rozszerzenie = strtolower(substr($nazwa_pliku,strrpos($nazwa_pliku,".")+1));
if ($rozszerzenie == 'jpg') $typ='jpg';
else if ($rozszerzenie == 'gif') $typ='gif';
else if ($rozszerzenie == 'png') $typ='png';
header( "Content-type: image/".$typ );
header("Content-Disposition: attachment; filename=\"screen.".$typ."\"");
znaczek($_GET['obraz'],"jedna z pozycji, która wymieniliśmy wcześniej, np. pd");
?>


Ostatnim krokiem jest wyświetlenie obrazka ;)


<img src="domena.pl/znak.php?obraz=adres do obrazka">


Dla bardziej zaawansowanych polecam ModRewrite ;)


I to już koniec ;) oto sposób jak w łatwy sposób choć trochę zabezpieczyć się przed złodziejami obrazków ;)
Tytuł: Odp: Znak wodny w PHP
Wiadomość wysłana przez: luku83 w Styczeń 29, 2012, 17:19:10
Witam,
wiem, że zadam głupie pytania, ale jak to mówią, kto pyta nie błądzi:

- $plik - trzeba go jakoś zdefiniować?
- adres dla $znaczek - wpisać w "" coś typu: "http://www.domena.pl/images/znaczek.gif"?
- imagesx($image1) - tu trzba wpisać konkretną liczbę?
- jak działa header?

Z góry dziękuję za odpowiedź.
Tytuł: Odp: Znak wodny w PHP
Wiadomość wysłana przez: Abik w Styczeń 29, 2012, 20:24:06
1.
Cytat: luku83 w Styczeń 29, 2012, 18:19:10- $plik - trzeba go jakoś zdefiniować?
nie wiem czy dobrze zrozumiałem pytanie
spójrz na linijkę trzecią... tam jest definicja funkcji, której pierwszym parametrem jest zmienna $plik, więc samego pliku jako taki nie definiujesz, a jedynie przekazujesz do tej funkcji jako parametr.
z resztą wywołanie tej funkcji możesz zauważyć w linijce numer 55 (przed ostatnia)... nazwa obrazka jest pobierana z globalnej tablicy asjocjacyjnej $_GET, w której umieszczone są zmienne z zapytania HTTP (tu jest np. zmienna o nazwie "obrazek")

2.
Cytatadres dla $znaczek - wpisać w "" coś typu: "http://www.domena.pl/images/znaczek.gif"?
tak : p

3.
Cytatimagesx($image1) - tu trzba wpisać konkretną liczbę?
nie
imagesx to funkcja, która zwraca z tego co widzę szerokość obrazu, który przymuje jako parametr.
w tym skrypcie pod zmienną $image1 zapisywany jest ten znak wodny, i to jego rozmiar jest tutaj ustalany... jak wstawisz tam cyferkę to skrypt w ogóle nie powinien działać

4.
Cytat: luku83 w Styczeń 29, 2012, 18:19:10jak działa header?
header dodaje po prostu podaną opcję do nagłówka odpowiedzi HTTP

ja generalnie nie znam się na php, więc mam nadzieję, że jakoś sensownie rozwiałem Twoje wątpliwości : p
Tytuł: Odp: Znak wodny w PHP
Wiadomość wysłana przez: luku83 w Styczeń 30, 2012, 12:11:23
Dzięki za odpowiedź, ale jeszcze nie wszystko jest jasne.

- $_GET['obraz'] - czy zamiast tego mogę podłożyć $_FILES['photo']['name'] (uploadowany plik z formularza)?

- czy ten skrypt zawiera od razu informację, gdzie jest zapisywane zdjęcie ze znakiem wodnym, czy dopiero mam użyć move_uploaded_file() ?
Tytuł: Odp: Znak wodny w PHP
Wiadomość wysłana przez: Abik w Styczeń 30, 2012, 14:30:19
Cytat: luku83 w Styczeń 30, 2012, 13:11:23$_GET['obraz'] - czy zamiast tego mogę podłożyć $_FILES['photo']['name'] (uploadowany plik z formularza)?
tego nie jestem pewny, ale powinno to działać
z tym, że nie koniecznie bo $_FILES['photo']['name'] zawiera chyba tylko nazwę pliku, a nie wiem czy $_GET['obraz'] nie jest jakiegoś typu wskaźnikiem, ale chyba też jest tylko nazwą, więc powinno działać

Cytat: luku83 w Styczeń 30, 2012, 13:11:23czy ten skrypt zawiera od razu informację, gdzie jest zapisywane zdjęcie ze znakiem wodnym, czy dopiero mam użyć move_uploaded_file() ?
z tego co widzę to zdjęcie ze znakiem wodnym jest zapisywane dokładnie tam gdzie zdjęcie bez znaku (gdzieś na serwerze gdzie jest ten plik)
Tytuł: Odp: Znak wodny w PHP
Wiadomość wysłana przez: CrimeS w Luty 05, 2012, 23:33:31
Heh, właśnie tego szukałem,
Będzie można było dodać to do hostingu obrazków :D
Tytuł: Odp: Znak wodny w PHP
Wiadomość wysłana przez: pisii35 w Luty 10, 2012, 23:17:53
Bardzo przydatne. dzięki.