Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Coś ala znak wodny
Forum PHP.pl > Forum > PHP
Gray
Witam, czy ktoś tutaj wie jak najprościej zrobić taki "znak wodny" jak ma kwejk.pl? Normalnie na ich stronie zdjęcia wyświetlają się bez niego ale po kliknięciu prawym/pokaż obrazek na samym dole obrazka pojawia się biały pasek i adres strony kwejk.pl

Pozdrawiam.
luck
Poszukaj sobie czegoś na temat "php watermark", jest tego sporo. Wszystkie wrzucane obrazki mają nakładany znak wodny, tyle że są tak ostylowane przez CSS, że na stronie po prostu tego nie widać - zasłania go czarna warstwa z przyciskiem Facebooka.
PS. A precyzyjniej mówiąc taki obrazek ma nadany styl "margin-bottom: -40px;"
Gray
Szukałem szukałem, znalazłem i w sumie tymczasowo zrobiłem taki pseudo watermark czyli dodaje mi watermark poprzez php... ale oglądając obrazek całkowicie z source to jest bez watermarka... ciężko o jakiś dobry tutorial dla nowych w php, może coś polecisz na dodawanie watermarka tak jak np. na kwejku czyli na stałe na obrazek? z tym marginem sobie poradzę smile.gif
tehaha
przecież w sieci jest tego pełno, nie tylko tutoriale ale nawet gotowe kody i gotowe klasy, które to robią więc czego Ci jeszcze brakuje?

http://www.google.pl/#hl=pl&sugexp=gsi...600&bih=750

http://www.google.pl/#sclient=psy-ab&h...600&bih=750

@DOWN ale przecież tego jest sporo są i tak z opisem tylko trochę poszukaj, ponadto pewnie nie znajdziesz takiego gdzie będzie linijka po linijce opisany kod, bo od tego jest manual, sprawdź sobie każdą funkcję w manualu i będziesz wiedział jak to działa
Gray
No tak ale część z nich to tylko sam kod bez wyjaśnienia jak go zaaplikować a druga część to właśnie takie watermarki jak ja już zrobiłem czyli obrazek ma watermark ale tylko jeśli przechodzi przez konkretny plik PHP np.:

/wm.php?src=images/obrazek.jpg blablabla

a po skasowaniu tego "wm.php?src=" jest już bez watermarku.
luck
Zamiast wstawiać to /wm.php?src=images/obrazek.jpg za każdym razem do źródła strony, zapisz sobie, np. podczas uploadu gotowy obrazek z watermarkiem i tego adresu używaj - o wiele szybsze/bardziej wydajne. Ew. robisz w bazie tabelę w której trzymasz URL obrazka i jakiś losowy hash. Wtedy wywołujesz obrazek tak:
Kod
/wm.php?src=85389583fac64c...

i już w skrypcie do nakładania znaków wodnych pobierasz z bazy właściwy adres obrazka. Moim zdaniem powinieneś jednak wybrać wersję nr 1.
Gray
Dzięki luck ale ja juz mam to zrobione z automatu... jednak nie w tym rzecz. Dodawany w ten sposób watermark nie jest na stałe, nie idzie zapisać obrazka na komputer tak, aby był on z watermarkiem.
luck
Cytat(Gray @ 14.09.2011, 16:23:01 ) *
Dodawany w ten sposób watermark nie jest na stałe, nie idzie zapisać obrazka na komputer tak, aby był on z watermarkiem.

Idzie, wystarczy zajrzeć do skryptu który masz i go trochę przerobić, żeby zamiast wyświetlać plik zapisywał go na dysku. Jeśli chcesz gotowca typu kopiuj/wklej to raczej marne szanse.
Gray
Mój kod uploadu obrazka wygląda tak:

CODE
//UPLOAD OBRAZKA
$sp1 = explode(".",($_FILES['obrazek']['name']));
if($sp1[1] == "gif" or $sp1[1] == "jpg" or $sp1[1] == "JPG" or $sp1[1] == "GIF" or $sp1[1] == "jpeg" or $sp1[1] == "JPEG" or $sp1[1] == "png" or $sp1[1] == "PNG")
{
$data_img=date('dmYHis');
$uploaddir = 'img/upload/'.$data_img.'-';
$_FILES['obrazek']['name'] = przyjazny_string($_FILES['obrazek']['name']);
if(move_uploaded_file($_FILES['obrazek']['tmp_name'], $uploaddir.$_FILES['obrazek']['name']))
{
//Zmiana rodzielczości obrazka
if($sp1[1] != "gif" AND $sp1[1]!= "GIF") {
$image = new SimpleImage();
$image->load($uploaddir.$_FILES['obrazek']['name']);
if($image->getWidth() > 670) {
$image->resizeToWidth(670);
$image->save($uploaddir.$_FILES['obrazek']['name']);
}
else { //Zmiana wielkości do tego samego rozmiaru ale z kompresją
$image->resizeToWidth($image->getWidth());
$image->save($uploaddir.$_FILES['obrazek']['name']);
}
}
//////////////////////////////
$obrazek='img/upload/'.$data_img.'-'.$_FILES['obrazek']['name'];
$tytul=htmlspecialchars($_POST['tytul']);
$zrodlo=htmlspecialchars($_POST['zrodlo']);
$autor=$_SESSION['login'];
$data=date('Y-m-d H:i:s');

$zapytanie = "INSERT INTO `shity` (`id`, `tytul`, `obrazek`, `zrodlo`, `autor`, `data`, `typ`) VALUES ('', '$tytul', '$obrazek', '$zrodlo', '$autor', '$data', 'obrazek')";
$wykonaj = mysql_query($zapytanie);
echo '<b>Obrazek został pomyślnie dodany!</b><br/>
<a href="index.php">&laquo; Strona Główna</a>';
}
else {
echo '<b>Wystąpił błąd podczas dodawania obrazka.</b><br>';
echo '<a href="dodaj.php">&laquo; Powrót</a>';
}
}
else {
echo '<b>Nie wybrano żadnego obrazka bądź jego format jest niedozwolony!</b><br/><a href="dodaj.php">&laquo; Powrót</a>';
}
//KONIEC UPLOAD OBRAZKA


Chcę do niego wsadzić to:

CODE
<?php

header('content-type: image/jpeg');

$watermark = imagecreatefrompng('watermark.png');
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$image = imagecreatetruecolor($watermark_width, $watermark_height);
$image = imagecreatefromjpeg($_GET['src']);
$size = getimagesize($_GET['src']);
$dest_x = $size[0] - $watermark_width - 5;
$dest_y = $size[1] - $watermark_height - 5;
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100);
imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);
?>



Czy ktoś może to dla mnie polączyć i napisać mniej więcej co zrobił, tak abym to zrozumiał?

Pozdrawiam.
nospor
No i super. A teraz zajrzyj do manuala i zobacz co robi funkcja
imagejpeg()
a dowiesz się jak zapisać na dysk.
Gray
nospor, wyczytałem w manualu jak zapisać imagejpeg()... ale to nie to...

Przerabiam gotowy skrypt dodawania obrazka czyli ten:

Kod
//UPLOAD OBRAZKA
$sp1 = explode(".",($_FILES['obrazek']['name']));
if($sp1[1] == "gif" or $sp1[1] == "jpg" or $sp1[1] == "JPG" or $sp1[1] == "GIF" or $sp1[1] == "jpeg" or $sp1[1] == "JPEG" or $sp1[1] == "png" or $sp1[1] == "PNG")
{
$data_img=date('dmYHis');
$uploaddir = 'img/upload/'.$data_img.'-';
$_FILES['obrazek']['name'] = przyjazny_string($_FILES['obrazek']['name']);
if(move_uploaded_file($_FILES['obrazek']['tmp_name'], $uploaddir.$_FILES['obrazek']['name']))
{
//Zmiana rodzielczości obrazka
if($sp1[1] != "gif" AND $sp1[1]!= "GIF") {
$image = new SimpleImage();
$image->load($uploaddir.$_FILES['obrazek']['name']);
if($image->getWidth() > 670) {
$image->resizeToWidth(670);
$image->save($uploaddir.$_FILES['obrazek']['name']);
}
else { //Zmiana wielkości do tego samego rozmiaru ale z kompresją
$image->resizeToWidth($image->getWidth());
$image->save($uploaddir.$_FILES['obrazek']['name']);
}
}
//////////////////////////////
$obrazek='img/upload/'.$data_img.'-'.$_FILES['obrazek']['name'];
$tytul=htmlspecialchars($_POST['tytul']);
$zrodlo=htmlspecialchars($_POST['zrodlo']);
$autor=$_SESSION['login'];
$data=date('Y-m-d H:i:s');

$zapytanie = "INSERT INTO `shity` (`id`, `tytul`, `obrazek`, `zrodlo`, `autor`, `data`, `typ`) VALUES ('', '$tytul', '$obrazek', '$zrodlo', '$autor', '$data', 'obrazek')";
$wykonaj = mysql_query($zapytanie);
echo '<b>Obrazek został pomyślnie dodany!</b><br/>
<a href="index.php">? Strona Główna</a>';
}
else {
echo '<b>Wystąpił błąd podczas dodawania obrazka.</b><br>';
echo '<a href="dodaj.php">? Powrót</a>';
}
}
else {
echo '<b>Nie wybrano żadnego obrazka bądź jego format jest niedozwolony!</b><br/><a href="dodaj.php">? Powrót</a>';
}
//KONIEC UPLOAD OBRAZKA


I chcę aby podczas powyższego uploadu obrazka dodatkowo był dodawany do niego watermark. Dlatego proszę aby ktoś pomógł mi i umieścił w tym kodzie, który zamieściłem powyżej najprostszy skrypt na watermarka jaki jest możliwy ja sobie go przeanalizuję i w miarę potrzeb zmodyfikuję.

Pozdrawiam.
phpion
Proszę o objęcie wklejonych źródeł bbcode odpowiednim dla języka kodu. Pogrubienia w wypowiedziach wydają się zbędne - proszę je usunąć.
Gray
dzięki za pomoc... phpion...
szczawik
A jak rozwiązać taki problem:
Standardowe "Zapisz jako" zapisuję z watermarkiem, a kliknięcie przycisku 'pobierz' bez?
Gray
No i gdzie mi temat zaśmiecasz... niech najpierw mi pomogą... chociaż w to wątpię...
tehaha
Cytat
No i gdzie mi temat zaśmiecasz... niech najpierw mi pomogą... chociaż w to wątpię...
Po takich wypowiedziach od razu widać, że jesteś jakimś dzieciakiem, który nauczył się, że się wszystko dostaje na zawołanie, gdybyś wykazał chociaż odrobinę własnej inicjatywy to już byś to dawno miał gotowe, Ty tylko szukasz murzyna, który odwali to za Ciebie. Watermark to jeden z najbardziej podstawowych i oklepanych tematów, w necie jest pełno tutoriali i gotowych skryptów. W czym mamy Ci pomóc skoro nie pokazałeś jak łączysz te skrypty? Jak czekasz na gotowca to czekaj dalej.
Gray
Nie, nie widać po tym, że jestem dzieckiem ale za to po tym co Ty napisałeś widać, że jesteś kolejnym cool gościem co włazi na forum żeby błyszczeć i pouczać zamiast pomagać.

Piszesz, że to takie proste to trzeba było mi pomóc a nie się mądrzyć. Przeszukałem internet i nie znalazłem tutoriala który by mi pokazał jak mogę wlepić skrypt watermarka do przerabianego przeze mnie skryptu. Sam też podejmowałem wiele prób zintegrowania go ale niestety niewiele zdziałałem drogą dedukcji.

Dlatego podałem CAŁY fragment mojego kodu dodającego obrazek oraz kod dodawania watermarka i poprosiłem aby ktoś mi pokazał jak je połączyć, czy to zbyt mało inicjatywy wg Ciebie? Jeśli wymagasz abym to zrobił sam, to całe to forum jest zbędne bo informacja o istnieniu google wbrew Twoim przekonaniom jest powszechnie znana.

Aha i mam 25 lat, nie życzę sobie aby uniesiony dumą tehaha nazywał mnie dzieciakiem. Nie chcesz pomagać to tutaj nie zaglądaj.
tehaha
- Jeżeli przejrzysz forum to zauważysz, że tutaj bardzo chętnie się pomaga ludziom, ale tylko wtedy jeżeli ktoś wykazuje wkład własny, a nie samo "tutaj macie 2 skrypty, weźcie je połączcie i powiedzcie jak to zrobiliście"
- Skoro próbowałeś na tyle razy to łączyć oraz sprawdzałeś tyle tutoriali w necie to dlaczego nie wkleiłeś tutaj ani jednej swojej próby? Gdybyś pokazał jak próbujesz to łączyć to byś dostał wskazówki dlaczego to nie działa. Przeanalizowałeś chociaż ten skrypt? sprawdziłeś każdą funkcję w manualu?
- Ty mylisz pojęcia - pomóc komuś to nie znaczy zrobić coś za kogoś

Cytat
widać, że jesteś kolejnym cool gościem co włazi na forum żeby błyszczeć i pouczać zamiast pomagać.
pod liczbą moich postów jest taki licznik "Pomógł", która wskazuje ile razy pomogłem komuś rozwiązać problem, tylko widzisz ja pomagam tylko tym, którzy coś z siebie dają

Cytat
Aha i mam 25 lat, nie życzę sobie aby uniesiony dumą tehaha nazywał mnie dzieciakiem. Nie chcesz pomagać to tutaj nie zaglądaj.
Aż ciężko uwierzyć tongue.gif Ale jeżeli tak jest to współczuje Ci tak małego zapału do pracy i tak mało wytrwałości przy wyzwaniach w tym wieku

Zobacz odpalasz Google i masz gotowe już skrypty, które robią dokładnie to co potrzebujesz, nie wierzę, że próbowałeś już wszystkie z nich, więc powiedz mi dlaczego ktoś ma siedzieć i robić specjalnie dla Ciebie coś co jest dostępne na wyciągnięcie ręki?

http://911-need-code-help.blogspot.com/200...th-another.html
http://x10hosting.com/forums/tutorials/108...-using-php.html
http://www.knowledgesutra.com/forums/topic...ple-php-script/
http://www.weberdev.com/get_example.php3?ExampleID=4640
Gray
Ty mnie chyba nadal nie rozumiesz, ja nie znam na tyle dobrze PHP aby to zrobić, a to że Ty mi pokazujesz gotowe skrypty w google nic mi nie daje... sam je znalazłem ale nie wiem jak je połączyć z tym skryptem który edytuję.

To co ja robiłem próbując łączyć te 2 skrypty było czysto przypadkowe i raczej niewiele tam było trafnych zmian więc nie ma sensu żebym to pokazywał. A już nie raz tutaj ktoś wspomniał, że to jest takie proste to nie łatwiej po prostu to wpasować, żebym wiedział jak? Zapewne wystarczy cały kod watermarka wkleić w odpowiednim miejscu w kodzie uploadu i zmienić część zmiennych.

Proszę o to nie dlatego, że sprawia mi przyjemność kiedy ktoś mi daje gotowe rozwiązanie tylko dlatego, że jestem na niskim poziomie w PHP i po prostu nie umiem tego zrobić. Zrobiłem wszystko co mogłem podając gotowe skrypty i oczekując jedynie aby ktoś pokazał jak to należy poprawnie połączyć. A mój zapał do pracy jest większy niż Ci się wydaje, ale po spędzeniu całego dnia na edycji kodu większości po omacku bez pozytywnych rezultatów można się poirytować.

Jeśli chodzi o funkcje to tak, czytałem w manualu i rozumiem mniej więcej cały skrypt do watermarka jednak ten skrypt uploadu jest już zbyt ciężki. Nie wiem jak zrobić np. aby po wygenerowaniu na końcu skryptu do watermarów gotowego obrazka imagejpeg($image); skrypt uploadu operował na tym własnie wygenerowanym obrazku a nie na $_FILES['obrazek']['name']. Próbowałem zamieniać $_FILES na zmienną generowaną, zmieniałem nazwy zmiennej co by się nie kłóciła z tymi z 2 skryptu... jednak na marne.

Ba, nawet nie wiem czy dobrze robiłem podając w skrypcie watermarka to $_FILES['obrazek']['name'] zamiast $_GET['src'] w $image = imagecreatefromjpeg($_GET['src']);
tehaha
no ale po co bierzesz jakieś 2 oddzielne skrypty, np. tutaj http://911-need-code-help.blogspot.com/200...th-another.html masz gotowy skrypt w nim nic nie trzeba zmieniać ani dodawać, ani łączyć tylko zapisać i uruchomić, więc nie znajomość php nie jest w tym wypadku żadną wymówką, bo gotowiec nie wymaga edycji. To co jest podane jako html form zapisujesz jako plik html, to jest jako skrypt php zapisujesz do pliku watermark-image.php, do tego samego katalogu co pliku wrzucasz też obrazek ze znakiem wodnym watermark.png, musisz też utworzyć foldery "originals/" i "images/" i tyle, odpalasz na serwerze i masz.
Gray
Gdybym chciał osobny gotowy skrypt to bym takowy znalazł. ja MUSZĘ wyedytować ten skrypt uploadu który podałem, jest on częścią większego skryptu którego używam, który edytuję i w którym jak narazie mam problem tylko z tym głupim watermarkiem.
tehaha
fajnie, że opisałeś to na samym początku.

Na sam początek tego skryptu wklej to co się znajduje między CREATE WATERMARK FUNCTION a FILE PROCESSING FUNCTION

i zaraz po:
  1. //////////////////////////////
  2. $obrazek='img/upload/'.$data_img.'-'.$_FILES['obrazek']['name'];


wstaw

  1. create_watermark($obrazek, $obrazek);


@DOWN: chodziło mi o fragment tego skryptu http://911-need-code-help.blogspot.com/200...th-another.html
Gray
Cytat(tehaha @ 25.09.2011, 23:50:54 ) *
Na sam początek tego skryptu wklej to co się znajduje między CREATE WATERMARK FUNCTION a FILE PROCESSING FUNCTION


Która funkcja jest która? Mówisz o tym kawałku?

  1. $watermark_width = imagesx($watermark);
  2. $watermark_height = imagesy($watermark);
  3. $image = imagecreatetruecolor($watermark_width, $watermark_height);
  4. $image = imagecreatefromjpeg($_GET['src']);
  5. $size = getimagesize($_GET['src']);
  6. $dest_x = $size[0] - $watermark_width - 5;
  7. $dest_y = $size[1] - $watermark_height - 5;


@EDIT:
Nie miałem pojęcia, że chodzi Ci o skrypt z innej strony. W tym wspomnianym przez Ciebie fragmencie nie trzeba wprowadzać żadnych zmian?

@EDIT
Dopiero teraz miałem czas, żeby to sprawdzić. Śmiga elegancko, dzięki tehaha oczywiście leci "pomógł" a teraz mam jeszcze takie dodatkowe pytanko. Jeśli bym chciał aby ten watermark nie nakładał się na obrazek ale żeby dodawał biały pasek np. 20px na dole obrazka wzdłuż jego poziomej krawędzi i na tym pasku dopiero widniał by napis czyli adres strony. Jak by to zrobić? Zakładam, że wymagana jest edycja tej części kodu watermarka:

  1. imagecopymerge(
  2. $source_gd_image,
  3. $overlay_gd_image,
  4. $source_width - $overlay_width,
  5. ($source_height - $overlay_height) - 10px,
  6. 0,
  7. 0,
  8. $overlay_width,
  9. $overlay_height,
  10. WATERMARK_OVERLAY_OPACITY
  11. );


Mógł bym prosić o wskazówkę jak to zrobić o ile jest to możliwe przy takim kodzie?
tehaha
najprościej będzie jak sobie po prostu zrobisz ten obrazek watermarka jako długi biały pasek z napisem, wtedy obędzie się bez większych modyfikacji kodu, jedynie ustawienie tego paska dostosujesz sobie edytując te 2 linijki:
  1. $source_width - $overlay_width,
  2. ($source_height - $overlay_height) - 10px,


domyślam się, że będzie to coś takiego:
  1. imagecopymerge(
  2. $source_gd_image,
  3. $overlay_gd_image,
  4. 0,
  5. ($source_height - $overlay_height) - 20px,
  6. 0,
  7. 0,
  8. $overlay_width,
  9. $overlay_height,
  10. WATERMARK_OVERLAY_OPACITY
  11. );

Gray
Nie działa ale to moja wina... walnąłem gafę podając fragment kodu który sam edytowałem próbując to ustawić... oryginalnie wygląda on tak:

  1. imagecopymerge(
  2. $source_gd_image,
  3. $overlay_gd_image,
  4. $source_width - $overlay_width,
  5. $source_height - $overlay_height,
  6. 0,
  7. 0,
  8. $overlay_width,
  9. $overlay_height,
  10. WATERMARK_OVERLAY_OPACITY
  11. );


Kiedy robię z tym -20px itd. nawet formularz się nie wyświetla... tylko biała strona.

Aha i nawiasem mówiąc, w przypadku kiedy zrobił bym gotowy biały pasek, czy skalował by się on do szerokości obrazka?
vee
Najrozsądniej i najwydajniej będzie chyba jednak zrobienie tego w taki sposób, że generujesz biały pasek na dole zdjęcia i na niego w prawym czy lewym jego końcu nakładasz gotowego PNG np. z logiem serwisu. Wtedy pasek będzie uniwersalnie szeroki, natomiast logo zawsze będzie w tym jego końcu, w którym sobie tego życzysz.
Gray
Ok, podoba mi się to, tylko "know how" by się przydało smile.gif
vee
Nie mam czasu teraz sprawdzać swoich teorii czy wymyślać bardziej zoptymalizowanych, pierwsze co mi przyszło do głowy:

- sprawdzasz rozmiar obrazka
- tworzysz za pomocą GD biały prostokąt o takiej samej szerokości jak obrazek i np. 50px wyższy
- na biały prostokąt kopiujesz oryginalny obrazek i pozycjonujesz go w lewym górnym rogu prostokąta. Pod obrazkiem zostanie Ci biały pasek.
- --||-- logo i pozycjonujesz na białym pasku

dwa ostatnie punkty możesz rozwiązać w podobny sposób jak jest to zrobione w wielu gotowych rozwiązaniach do nakładania znaku wodnego (pierwszy "znak wodny" to oryginalny obrazek, drugi znak wodny to logo) przy czym bez obsługi jakiejś przezroczystości.

Pozdrawiam.
Gray
Ok poddaję się. Jeśli komuś będzie się chciało to proszę o podpowiedz w postaci kodu. Jeśli nie to i tak wystarczająco pomocy już uzyskałem i pozostanę przy zwykłym watermarku. Dzięki.

Pozdrawiam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.