Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Przezroczystość obrazków w GD
Forum PHP.pl > Forum > Przedszkole
Kshyhoo
Borykam się z problemem przezroczystości obrazka. Chcę uciąć obrazek pod kątem. Wiadomo, że takiej funkcji nie ma - obracam więc obrazek o jakiś kąt, tnę i odwracam ponownie. Działanie to sprawdza się, ale mam problem z fragmentami, gdzie obrazka nie było - pozostaje czarne tło. Przerobiłem wszelkie dostępne kody z manuala i Google, jak dotąd bez znaczącego efektu. Oto mój kod w wersji rozwojowej:
  1. <?php
  2. $obraz1 = 'red.png';
  3. $obraz2 = 'blue.png';
  4.  
  5. $img1 = imagecreatefrompng($obraz1) or die ("Nie odnaleziono obrazka 1");
  6. $img2 = imagecreatefrompng($obraz2) or die ("Nie odnaleziono obrazka 2");
  7.  
  8. $obrot1 = 320;
  9. $obrot2 = 40;
  10. // obrot
  11. $obracam1 = imagerotate($img2, $obrot1, -1, 0);
  12. imagealphablending($obracam1, true);
  13. imagesavealpha($obracam1, true);
  14. // ciecie
  15. $tne1 = imagecreatetruecolor(76, 282);
  16. imagecopymerge($tne1, $obracam1, 0, 0, 56, 0, 76, 282, 100);
  17. // obrot powrotny
  18. $obracam2 = imagerotate($tne1, $obrot2, -1, 0);
  19. imagealphablending($obracam2, true);
  20. imagesavealpha($obracam2, true);
  21. // tne do wymiaru
  22. $tne2 = imagecreatetruecolor(155, 200);
  23. imagecopymerge($tne2, $obracam2, 0, 0, 60, 0, 155, 200, 100);
  24.  
  25. imagecopymerge($img1, $tne2, 0, 0, 0, 0, 155, 200, 100);
  26.  
  27. header('Content-Type: image/png');
  28. imagepng($img1);
  29.  
  30. imagedestroy($tne1);
  31. imagedestroy($tne2);
  32. imagedestroy($obracam1);
  33. imagedestroy($obracam2);
  34. imagedestroy($img1);
  35. imagedestroy($img2);
  36. ?>
wookieb
  1. <?php
  2. imagealphablending($obracam2, false);
  3. ?>

W tych miejsach musisz dać false.
Kshyhoo
Tak, mam tak i to działa. Problem jest przy cięciu...
wookieb
Cytat(Kshyhoo @ 10.06.2009, 13:50:54 ) *
Tak, mam tak i to działa. Problem jest przy cięciu...


Jesteś pewien? Bo na kodzie tego nie widać.
  1. <?php
  2. imagealphablending($obracam1, true);
  3. ?>

Popraw kod i wrzuć

fla $tne2 tez musisz zastosowac przezroczystosc.
  1. <?php
  2. imagealphablending($tne2, false);
  3. imagesavealpha($tne2, true);
  4. ?>

Podobnie dla $img1 i wszystkich tych na ktorych tego nie masz.
Kshyhoo
1. Obrazek oryginalny.
2. Obrazek po pierwszym obrocie.
3. Obrazek po pierwszym cięciu.
1. 2. 3.

EDIT: Wydaje mi się, że robię błąd przy wywołaniu funkcji imagecreatetruecolor(). Ona tworzy obrazek, gdzie tłem jest czarny...
wookieb
A pokażesz teraz kod?
rejper
Chyba mam pomysł. Pokaż kod
Kshyhoo
Wiele się nie zmieniło, to kod pierwszego obrotu i pierwszego cięcia:
  1. <?php
  2. $obrot1 = 320;
  3. $obrot2 = 40;
  4. // obrot
  5. $obracam1 = imagerotate($img2, $obrot1, -1, 0);
  6. imagealphablending($obracam1, false);
  7. imagesavealpha($obracam1, true);
  8.  
  9. // ciecie
  10. $tne1 = imagecreatetruecolor(76, 282);
  11. imagecopymerge($tne1, $obracam1, 0, 0, 56, 0, 76, 282, 100);
  12.  
  13. header('Content-Type: image/png');
  14.  
  15. imagepng($tne1);
  16. ?>





EDIT: znalazłem rozwiązanie:
imagecopyresampled()
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.