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, 14:03:54

Tytuł: Znak wodny w PHP
Wiadomość wysłana przez: Kaczy w Styczeń 29, 2011, 14: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, 16: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, 19:24:06
1.
- $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.
Cytuj
adres dla $znaczek - wpisać w "" coś typu: "http://www.domena.pl/images/znaczek.gif"?
tak : p

3.
Cytuj
imagesx($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.
jak 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, 11: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, 13:30:19
$_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ć

czy 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, 22: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, 22:17:53
Bardzo przydatne. dzięki.