Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]+GD Przejście między zdjęciami
Kazaan
post
Post #1





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 17.07.2008

Ostrzeżenie: (0%)
-----


Witam, jak w temacie, chodzi mi o stworzenie skryptu dzieki ktoremu uzyskal bym przejscie między dwoma zdjęciami przy użyciu gd...
macie jakies pomysły ? jedyne co przychodzi mi do glowy to stopniowe nakladanie transparentu z jednej strony zdjecia do polowy, i tak przygotowane zdjecie nalozyc na kolejne. Kwestia jak to zrobic ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




GD niestety nie ma nic do zaoferowania sensownego by zrobić takie przejście płynne i, co tu dużo mówić ładnie oraz naturalnie wyglądające, trzeba się posiłkować niestety dość wolno działającymi skryptami, a do tego mało wydajnymi, bo liczenie jest dla każdego piksela obrazu. Sam kiedyś podobny filtr pisałem ale w Matlabie. To przypomina symulację nadawania przezroczystości dynamicznie. Jak działał?
1. Brałem dwa obrazy A i B o tej samej rozdzielczości (jeśli nie były - przeskalowywałem do identycznej)
2. W pętli po całej szerokości robiłem wzorek mniej więcej taki
  1. $A = //pierwszy obrazek w formacie GDimage
  2. $B = //drugi obrazek w fomacie GDimage
  3. $wynik = = imagecreatetruecolor($szerokosc, $wysokosc);
  4. for($i = 0; $i<$szerokosc; $i++) {
  5. $stopienA = $i/$szerokosc;
  6. $stopienB = 1 - $i/$szerokosc;
  7. for( $j = 0; $j< $wysokosc; $j++ ) {
  8. $colorA = imagecolorsforindex($im, imagecolorat($A, $i, $j) );
  9. $colorB = imagecolorsforindex($im, imagecolorat($B, $i, $j) );
  10. $color = imagecolorallocate($wynik, (int)($colorA['red']*$stopienA+$colorB['red']*$stopienB), (int)($colorA['green']*$stopienA+$colorB['green']*$stopienB), (int)($colorA['blue']*$stopienA+$colorB['blue']*$stopienB) );
  11. imagesetpixel($wynik, $i, $j, $color);
  12. }
  13. }

Możesz owszem kombinować z nadawaniem obu obrazkom tylko poziomu alfa w pętli, ale kod nie różni się wiele od tego powyżej. Różnica leży bowiem tylko w tym jak piksele obrazu traktujesz. A efekt wcale lepszy nie jest. Tylko zwracaj uwagę na szerokość i wysokość, bo we wszystkich 3 muszą być identyczne. Jeśli nie będą, to musisz sam sobie przeskalować A, B i wynik by były! Wydajne to nie jest, ale niestety GD nie ma wsparcia dla nadawania w prosty sposób alfy konkretnemu pikselowi lub grupie pikseli i trzeba to samemu implementować poprzez manipulacją alfy dla każdego piksela z osobna lub poprzez cudowanie. Możesz ewentualnie jeden z obrazów użyć od razu jako wynikowy i to będzie jedyna optymalizacja w sumie.

PS... Musisz uważać na zaokrąglenia dla wartości skrajnych. Jeśli trzeba będzie to daj zaokrąglenie w dół bo jest pewniejsze w tym wypadku.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.10.2025 - 23:56