Poznámka: články jsou již mnoho let staré, doba se posunula, mnoho věcí v nich doporučovaných je již dnes překonané - berte s rezervou!


Watermarky v PHP

Třeba se vám už někdy stalo, že jste našli svůj obrázek nebo fotku na cizím webu, kde ji někdo vydával za své dílo. Ještě lépe si k ní připojil svůj copyright.

Je to sice porušení autorského práva, snažit se ale domáhat se spravedlnosti je stejně zbytečné, možná dosáhnete toho, že fotka bude z webu stažená, ale to je tak vše.

Když jsou to obrázky z dovolené, nic hrozného to asi není, ale realitní kancelář mého známého se setkávala s případy, že jiná realitní kancelář obsala inzeráty z jejich stránek a stáhla jejich fotky a když se přihlásil zájemce, ještě měli tu drzost žádat o provizi.

Dnes se již standardně fotky chrání pomocí takzvaných watermarků. Určitě jste je již viděli např. na stránkách internetových obchodů - do obrázku je vložen poloprůhledný text s názvem firmy nebo s logem. Nesníží se tím informativní hodnota fotografie a přitom vám takto upravenou fotku nikdo neukradne, protože by musel buď logo vystříhnout nebo složitě retušovat.

Pokud chcete watermark vkládat automaticky, můžete použít opět GD knihovnu (stejně jako při vytváření thumbnailů ).

Budete také potřebovat samostatný obrázek s watermarkem - do něj můžete vložit logo vaší firmy. Funkce watermark, kterou vám za chvíli předvedu počítá s tím, že tento obrázek bude ve formátu gif. Formát gif se hodí proto, že sám v sobě obsahuje možnost průhlednosti, která se hodí (stačí průhlednost, není nutná částečná průhlednost, která je ve formátu png). Ukládat ve formátu gif umí většina grafických editorů. Průhlednost gifu využijte tak, že logo nakreslíte běžnými barvami a na pozadí použijte "průhlednou barvu".

Nyní už stačí jen použít následující funkci watermark, které předáte cesty k obrázku, který chcete upravit (formát jpg), a cestu k souboru s watermarkem (gif) a cestu, kam chcete uložit výsledný soubor (bude ve formátu jpg).

Na závěr bych chtěl upozornit, že jsem již zveřejnil návod, jak dosáhnout toho samého v ASP.NET - přečíst si o tom můžete v článku Watermarky v ASP.NET

function watermarkbyimage( $imagepath, //cesta k zdrojovemu jpeg obrazku $watermarkpath, //cesta k obrazku s watermarkem $outputpath, //cesta pro vystupni obrazek $transparency = 80, //pruhlednost watermarku (0-100) $Xoffset = 0, //posunuti watermarku v X souradnici $Yoffset = 0, //posunuti watermarku v Y souradnici $Xalign = "middle", //umisteni watermarku v x souradnici //lze zadat "middle", "left", "right" $Yalign = "bottom" //umisteni watermarku v y souradnici //lze zadat "top, "middle", "bottom ) { //otevreme oba zdrojove obrazky $image = imagecreatefromjpeg($imagepath); $imagew = imagecreatefromgif($watermarkpath); //zjistime jejich velikost list($watermarkWidth, $watermarkHeight) = getimagesize($watermarkpath); list($imageWidth, $imageHeight) = getimagesize($imagepath); $xpos = 0; $ypos = 0; //podle parametru funkce upravime promene //xpos a ypos if ($Xalign == "middle") { $xpos = $imageWidth/2 - $watermarkWidth/2 + $Xoffset; } if ($Xalign == "left") { $xpos = 0 + $Xoffset; } if ($Xalign == "right") { $xpos = $imageWidth - $watermarkWidth - $Xoffset; } if ($Yalign == "middle") { $ypos = $imageHeight/2 - $watermarkHeight/2 + $Yoffset; } if ($Yalign == "top") { $ypos = 0 + $Yoffset; } if ($Yalign == "bottom") { $ypos = $imageHeight - $watermarkHeight - $Yoffset; } //vlozime watermark do obrazku imagecopymerge($image, //zdrojovy obrazek $imagew, //obrazek watermarku $xpos, //x-souradnice, na kterou bude vlozen //watermark ve zdrojovem obrazku $ypos, //y-souradnice, na kterou bude vlozen //watermark ve zdrojovem obrazku 0, 0, $watermarkWidth, $watermarkHeight, $transparency); //pruhlednost //ulozime obrazek do souboru, parametr 100 nastavuje //uroven komprese na nejmene ztratovou kompresi imagejpeg($image, $outputpath, 100); }

Po naincludovaní funkce do příslušné stránky již stačí správně funkci zavolat a obrázek máte označený. Příklady volání:

//zakladni verze - umisti watermark //doprostred dolu s pruhlednosti 80 watermarkbyimage("source.jpg", "watermark.gif", "output.jpg"); //pouziti nepovinnych parametru - umisti watermark nahoru //vpravo posunuty o 10px dolu a doleva watermarkbyimage("source.jpg", "watermark.gif", "output.jpg", 10, 10, "top", "right");


Ohodnoťte prosím užitečnost článku




136
 
69
 
39
 
25
 
20
 
 
Vložit komentář:
 

 



 

 

Nepoužívejte žádné html ani texy značky, odřádkování se zachová. Pokud uvádíte zdrojový kód, můžete ho vložit mezi značky
<syntax jazyk="PHP">...</syntax>,
bude potom zformátován. Jako atribut můžete uvést PHP, C#, HTML, CSS a mnoho dalších.


opiste cislo Opište číslo:

 

12. 4. 2006 8:15:50
[1] (Rekin)
v ASP.NET odpovědět
Bude podobný článek i o ASP.NET???
13. 4. 2006 8:32:05
[2] (Trupík (jakub.maly(at)atlas.cz))
RE: v ASP.NET odpovědět
Ano. Program mám už připravený a sám ho používám, zbývá ho už jenom vhodně okomentovat.
13. 4. 2006 11:01:35
[3] (Trupík (jakub.maly(at)atlas.cz))
Watermarky v ASP.NET odpovědět
Tak článek již byl zveřejněn.
http://trupik.aspweb.cz/programovani/csharp-aspnet/watermarky-v-aspnet.aspx
21. 4. 2006 9:42:28
[4] (Alda (linhart(at)shocart.cz))
cesta ke zdroji odpovědět
Rozumim tomu spravne, ze zdrojovy obrazek se tim ale necohrani? Jinymi slovy, pokud nekdo vleze do zdroje, tak neni problem zjistit, kde najde zdrojovy obrazek?
21. 4. 2006 18:23:42
[5] (Trupik (jakub.maly(at)atlas.cz)) www
RE: cesta ke zdroji odpovědět
Teď tomu moc nerozumím. No provede se to, že se vytvoří nový obrázek, do kterého se vloží kopie původního a přes něj poloprůhledný watermark. Trošku jsem znejistěl, ale pochybuju, že se dá nějak jednoduše z tahovéhle "slitiny" rekonstruovat původní obrázek. Nebo do jakého zdroje by měl někdo lézt?
24. 4. 2006 16:09:49
[6] (Alda (linhart(at)shocart.cz))
zdroj znovu odpovědět
No mozna jsem to blbe pochopil ja. Takze pouziti teto fce je vlastne napr. pri nejakem uploadu obrazku pres redakcni system. Na serveru teda vlastne zustava i obrazek puvodni i s watermarkem? Myslel jsem puvodne, ze by fce umistovala watermark jaksi "on fly" a tudiz by sly dohledat originaly. Takto to ted chapu, ze pokud nekdo nahodou neobjevi zdrojovy adresar, tak ze zdroje stranky nema sanci zjistit umisteni orig. obrazku. Pro samotno web. stranku je vlastne ale potreba obrazky s watermarkem jiz mit nachystane a zde uvedena fce vlastne slouzi k predchystani. Nejsem zas tak sbehly v php a tak se omlouvam za mozna blbe otazky.... Diky za osvetleni. Mimochodem, vite nekdo jak presne funguje ztratova komprese u JPG. Pri te kompresi 100 se zmeni velikost (kb) a kvalita casti, kde watermark neni nebo ne?
24. 4. 2006 21:29:28
[7] (Trupík (jakub.maly(at)atlas.cz))
RE: Zdroj znovu odpovědět
Ano, použití je přes redakční systém. Někdo například odešle soubor obrázku na serveru a ten se hned po odeslání upraví. Tím ale vznikne na serveru úplně nový obrázek (v novém souboru) a původní je můžete klidně hned smazat další funkcí. Takže pokud nechcete, nikdo ho nedohledá.
Co se týče ztrátové komprese jpeg, knihovna GD pro svou práci používá nějaký interní formát, nevím přesně jaký, ale předpokládám, že bezeztrátový. Takže dokud obrázek "žije" jen v paměti serveru, ke kompresi nedochází. V momentě, kdy se obrázek ukládá do souboru, je třeba vybrat jeho formát a u formátu jpeg lze také upřesnit jeho kompresi. Tato komprese se týká celého obrázku, tedy kompletní fotografie i s watermarkem.
6. 12. 2006 17:46:58
[8] (Kriss)
OMG odpovědět
OMG takhle dlouha funkce na tak jednoduchou vec?????
Me se to povedlo napsat na +-6 radku:
$transparent_color = imagecolorallocatealpha($tmp_image_new, 150, 150, 150, 105); for($x=1; ($x-1)*200<$image_new_width; ++$x) { for($y=1; ($y-1)*150<$image_new_height; ++$y) { imagettftext($tmp_image_new, 20, -30, (($x-1)*200)+50, (($y-1)*150)+40, $transparent_color, "./fonts/ARIAL.TTF", "(c) Kriss"); } }
6. 12. 2006 17:56:42
[9] (Kriss)
Admin? odpovědět
By me zajmaly znalosti PHP admina tohohle webu. Radkovani je jedna z nejdulezitejsich veci neceho tak jednoduchyho jako je diskuze
10. 12. 2006 12:26:31
[10] (kriznik)
jdete na to ponekud zvlastne odpovědět
tohle je nesmyslna funkce a ani to co psal kriss neni idealni, proc bych mel na serveru uchovavat duplikat s watermarkem/bez ? ja si udelal funkci, ktera vezme zdroj, vezme watermark a zobrazi ho uzivateli > pres header(content-type: image/png) kdyz bych si predstavil, pouzivat to co tu pisete treba na nejakym serveru jen s obrazkama, kde by bylo 10000obrazku a 10000kopii s watermarkem, tak me jima hruza... ;)))
16. 1. 2007 16:23:47
[11] (Trupik (jakub.maly(at)atlas.cz)) www
To Kris, RE: OMG odpovědět
Dobrý den,
ano, formátování komentářů bylo odfláknuté, takže teď již v nich funguje jak řádkování tak zvýrazňování kódu. Sice jen nevím, co to má co dělat s mými znalostmi PHP (už jen proto, že celý tento web je napsaný v pro ASP.NET).

Co se týče vaší funkce (teda spíš kusu kódu), tak máte pravdu, že je kratší, ale vůbec nedělá to samé - ta moje především umožňuje zpracovávat parametry tak, aby byla snadno použitelná. Vy tam máte všechny hodnoty "natvrdo" což ve mně evokuje dojem, že tento kód jen zkopírujete tam, kam potřebujete a opět natvrdo upravíte parametry. Jestli to skutečně takhle je, tak bych se tím moc nechlubil.
16. 1. 2007 16:28:00
[12] (Trupik (jakub.maly(at)atlas.cz)) www
To kriznik, RE: jdete na to ponekud zvlastne odpovědět
Zatím jsem se nesetkal se scénářem, ve kterém by měl provozovatel zájem na uchovávání fotek bez watermarku na serveru, takže se hned po upravení mažou. I kdyby tam ale byla každá fotka dvakrát, tak je to rozdíl jen o konstantu... :D

S vaším způsobem jsem ještě nijak neexperimentoval, takže nevím, ale jak si poradí Internet Explorer s formátem PNG?
5. 2. 2007 10:03:08
[13] (Clown (webmaster(at)vikingagency.cz)) www
PNG s JPG odpovědět
Tehle fce velice uziju jelikoz IE nepodporuje pruhlednodst PNG. Tenhle problem nastal ve chvili kdy jsem uploadoval cely server a zjistil jsem ze PNG neumi pruhlednost.
Hruza a des ale zkusim to s watermarkem a naslednem ulozeni na server. Ma to i dalsi vyhodu protoze kdyz se obrazek uz jednou zmensi a ulozi tak nasledne nacitani je podstatne kratsi nez kdyz by mel prochazet cely skript.
5. 2. 2007 11:54:24
[14] (Clown (webmaster(at)vikingagency.cz)) www
PNG s JPG odpovědět
Tak jsem se tim trosku provrtal a opravuju - jen jsem nahradil PNG za GIF :)
21. 4. 2007 22:10:54
[15] (jirka)
drobna chybka v parametrech odpovědět
V uvedenem prikladu jsou prehozeny hodnoty top a right, spravne poradi je "right","top"

//dalsi parametry - pruhlednost, posun x a y, umisteni x a y

watermarkbyimage("input.jpg", "vodoznak.png", "output.jpg", 20, 10, 10,"middle","bottom");

// po drobne uprave je mozne pouzit i png

// pouziti s gif
//$imagew = imagecreatefromgif($watermarkpath);
// pouziti s png
$imagew = imagecreatefrompng($watermarkpath);
8. 5. 2007 15:04:48
[16] (Vitek (vitekborec(at)gmail.com)) www
Moc dík odpovědět
Dík pár funkcí jsem neznal, díky tobě je znám a není tohle pro mě žádnej problém! Problém je ovšem co když narazim na gif, no nic jdu to testovat dál :D
28. 5. 2007 1:09:39
[17] (R)
Watermark odpovědět
kriznik --- muzes nejak popsat tu tvoji metodu? Nechapu jak to pres header,content-type by melo fungovat.
19. 10. 2007 11:18:08
[18] (Aleš (ales(at)halfar.name))
díky odpovědět
Díky za funkci, je přehledná a naprosto vyhovuje, ušetřila mi dost času.

Děkuji
15. 6. 2008 16:55:45
[19] (Medvídek (medvidek88(at)gmail.com))
Header :) odpovědět
že místo
<img src=obrazek.jpg>
můžete použít třeba
<img src=vodoznak.php?original=obrazek.jpg>
Lepší je, pokud jsou originály na serveru a názvy a ktomu ID uložené v DB, pak by to šlo krásně <img src=vodoznak.php?22>a automaticky by se generoval obrazek :) Ten by se pak třeba cacheoval
28. 7. 2008 13:13:56
[20] (KAiTH (kaithicek(at)gmail.com))
pozadi watermarku odpovědět
Zdravim,
kdyz do vaseho zdrojaku vkladam GIF, tak se olemuje bilou barvou. Kdyz do nej vlozim PNG, tak se pro zmenu ten watermark podlozi bilim rameckem o velikosti toho watermarku. Nevite co s tim aby to tam nebylo, aby to bylo pruhledne?
29. 7. 2008 21:49:25
[21] (Trupik (jakub.maly(at)atlas.cz)) www
Re: pozadi watermarku odpovědět
[20] mělo by stačit, aby byl průhledný samotný gif/png. Pro detaily se podívejte do manuálu na funkce imagecraetefrom* a imagecopymerge.
8. 5. 2009 23:16:08
[22] (SMO (smo(at)zkusmo.cz)) www
Ještě něco navíc... odpovědět
Potřeboval jsem jestě něco navíc. Vložit do levého dolního rohu URL obchodu a do pravého dolního rohu logo výrobce zboží. Podrobný článek na: http://www.zkusmo.cz/programovani/php-programovani/vodotisk
21. 2. 2010 23:55:48
[23] (Ocas (neco(at)nekde.cz))
Vyvolání odpovědět
Všem se moc omlouvám za svou tupost, ale nikde nevidim jak mám potom ten obrazek vytahnout?

Děkuju