Clicky

Skocz do zawartości


Zdjęcie
- - - - -

Nakładanie dwóch obrazów na siebie [GD] [SOLVED]

5 odpowiedzi w tym temacie
php gd

  • Zaloguj się, aby dodać odpowiedź

#1 kevin

kevin

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 207 postów

Napisano 26 listopad 2013 - 20:54

Cześć.

 

Muszę zmodyfikować uploader obrazków tak, aby do wgrywanego zdjęcia dodawał background (ramka, która ozdobi zdjęcie). Trochę mam problem z tym, ponieważ nie wiem od której strony do tego podejść.

 

Załóżmy, że użytkownik wgrywa niebieski obrazek (patrz link niżej) i musimy nałożyć tą ozdobną ramkę (w tym przypadku to czerwony border) - efekt końcowy powinien tak wyglądać: http://iv.pl/images/...10486660858.jpg

 

Krawędź niebieskiego nie powinna wychodzić poza ozdobną ramkę - oczywiście to tylko przykład ramką w moim przypadku ma kształt elipsy (coś właściwie na wzór elipsy)

 

Dostałem radę, aby stworzyć to jako znak wodny, ale efekt końcowy wygląda w ten sposób: http://iv.pl/images/...17442539547.jpg

 

Nie wiem w jaki sposób dociąć grafikę tak, aby nie wychodziła poza ramkę a idealnie do niej przylegała

Ktoś ma jakieś pomysły?



#2 mck

mck

    Jestę Blogerę

  • Admin
  • 1544 postów

Napisano 26 listopad 2013 - 21:25

Może spróbuj w drugą stronę - na obrazek nałóż ramkę :)



#3 kevin

kevin

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 207 postów

Napisano 26 listopad 2013 - 22:27

Wówczas mamy scenariusz, który przedstawiłem w drugim zdjęciu. Obrazek uploadowany wychodzi poza ramkę. (screen: http://iv.pl/images/...95118481001.png)

 

Ogólnie mój testowy kod wygląda w ten sposób:

$img = Image::factory('foty/asdfasd.jpg');
$img->resize(900, 600, Image::INVERSE)->crop(900, 600);
$s = 'foty/asdf/'. time() .'_'. time() .'.png';
$img->save($s);
unset($img);
 
$img = Image::factory($s);
$dodaj = Image::factory('foty/bgtest.png');
$img->watermark($dodaj);
$img->save($path);

Dane:

 

Plik "asdfasd.jpg" - przykładowy obrazek (wymiary: 900x900px) (link: http://www.iv.pl/ima...14510842529.jpg)

Plik "bgtest.png" - jest to czerwone tło, wymiary: 800x700

 

I teraz wyjaśnienie:

Celowo zwiększam obszar roboczy dla obrazka uploadowanego, ponieważ jak będzie on mniejszy niż "bgtest.png" to czerwona ramka nałoży się tylko w połowie.



#4 mck

mck

    Jestę Blogerę

  • Admin
  • 1544 postów

Napisano 27 listopad 2013 - 07:57

No przy takim kształcie to łatwo nie będzie, bo rozumiem, że tło poza ramką musi być transparentne? I jak z wymiarami - będą stałe czy też ramka będzie się dostosowywać do obrazka?



#5 kevin

kevin

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 207 postów

Napisano 27 listopad 2013 - 18:50

Ok, rozwiązałem problem w ten sposób. 

 

1) Wgrywamy plik przez upload (niech będzie to np. "asdfasd.jpg" co podałem link wyżej)

Zmniejszamy wymiary (funkcje: resize+crop z kohana image module)

2) Nakładamy znak wodny na środek pracy (na wrzucony obrazek).

UWAGA ważne: znak wodny powinien być przezroczysty, ale wokół musi być tło (np. różowy)
Czyli jak mamy np. plik: 
http://iv.pl/images/...32883816708.png to środek zostawiamy przezroczysty, później mamy border i następnie nasz różowy kolor na całą pracę.

 

Dodajemy ten kolor, aby elementy, które wystają poza czerwone obramowanie zostały ucięte - plus dodatkowo: musimy wyciąć po obramowaniu, które jest zaokrąglone na różne sposoby.

3) Zapisujemy w/w obrazek i później za pomocą funkcji (link: http://stackoverflow...transparent-png) usuwamy ten różowy kolor.

 

Gotowe.

Jedyny minus jaki zaobserwowałem to utrata jakości, lekkie poszarpanie wokół czerwonej ramki. Może zbyt słabe "quality" dla obrazka mam ustawione, nie wiem potestuje jeszcze.

 

Temat wstępnie zamknięty.



#6 mck

mck

    Jestę Blogerę

  • Admin
  • 1544 postów

Napisano 27 listopad 2013 - 19:06

Ja bym to zrobił nieco inaczej.

Jeśli ramka ma znany kształt i wymiary, to zrobiłbym dodatkowo maskę określającą maksymalny kształt obrazka. Czyli jeśli ramka jest okręgiem, to maska będzie kołem o nieco mniejszej średnicy, tak by nie wystawała poza ramkę. Następnie z obrazka wyciąłbym (ustawił na przezroczyste) wszystko, co nie leży w masce analizując maskę piksel po pikselu (jeśli ma kolor, to przepisuję z obrazka, jeśli przezroczysty, to ustawiam przezroczysty). No i na koniec nałożenie samej ramki to już bułka z masłem.







Również z jednym lub większą ilością słów kluczowych: php, gd

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych