Forum graficzne Burning-Brushes.pl

Znak wodny w PHP

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_y00$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 ;)


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ź.


Abik

  • VIP
  • *****
    • Amerykański plastik
      • Zobacz profil
    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


    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() ?


    Abik

    • VIP
    • *****
      • Amerykański plastik
        • Zobacz profil
      $_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)


      Heh, właśnie tego szukałem,
      Będzie można było dodać to do hostingu obrazków :D