Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tworzenie z poziomu php pliku png z transparencją
Forum PHP.pl > Forum > PHP
Avatarus
Witam
Mam problem z transparencją pliku png.
Mam plik png ma transparencje na kolor czarny.
Plik jest pobierany z pliku na komputerze i później zmniejszany do odpowiednich rozmiarów.
do tego momentu działa dobrze, ale nie zachowuje transparencji.

Jak to poprawić?
moja funkcja to tworzenia miniatur wygląda tak:
  1. function createthumbnail($filetype,$origfile, $thumbfile, $new_w, $new_h,$kompresja,$co='') {
  2. global $ustawienia;
  3. if ($filetype == 1) { $origimage = imagecreatefromgif($origfile); }
  4. elseif ($filetype == 2) { $origimage = imagecreatefromjpeg($origfile); }
  5. elseif ($filetype == 3) { $origimage = imagecreatefrompng($origfile); }
  6.  
  7. $old_x = imagesx($origimage);
  8. $old_y = imagesy($origimage);
  9. if ($ustawienia[galeria_inteli]=='OFF' or $co=1)
  10. {
  11. if ($old_x > $new_w || $old_y > $new_h) {
  12. if ($old_x < $old_y) {
  13. $thumb_w = round(($old_x * $new_h) / $old_y);
  14. $thumb_h = $new_h;
  15. } elseif ($old_x > $old_y) {
  16. $thumb_w = $new_w;
  17. $thumb_h = round(($old_y * $new_w) / $old_x);
  18. } else {
  19. $thumb_w = $new_w;
  20. $thumb_h = $new_h;
  21. }
  22. } else {
  23. $thumb_w = $old_x;
  24. $thumb_h = $old_y;
  25. }
  26. }
  27. else
  28. {
  29. $thumb_w = $new_w;
  30. $thumb_h = $new_h;
  31. }
  32. if ($kompresja == "gd1") {
  33. $thumbimage = imagecreate($thumb_w,$thumb_h);
  34. $result = imagecopyresized($thumbimage, $origimage, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y);
  35. } else {
  36. $thumbimage = imagecreatetruecolor($thumb_w,$thumb_h);
  37. $result = imagecopyresampled($thumbimage, $origimage, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y);
  38. }
  39.  
  40. touch($thumbfile);
  41.  
  42. if ($filetype == 1)
  43. {
  44. imagegif($thumbimage, $thumbfile);
  45. }
  46. elseif ($filetype == 2)
  47. {
  48. imagejpeg($thumbimage, $thumbfile);
  49. }
  50. elseif ($filetype == 3)
  51. {
  52. imagepng($thumbimage, $thumbfile);
  53. }
  54. }
Piro
Zastanawiam się czy nie można by było zrobić tego w ten sposób (kiedyś coś takiego zrobiłem, chyba na gifach to miało działać, ale nie pamiętam już nazwy projektu):

Użycie funkcji imagecopy()
  1. $tlo = imagecreatefrompng($plik);
  2. // $plik przechowuję ścieżkę do przezroczystego tła na które będzie "naklejony" obrazek;
  3. imagecopy($tlo, $origimage, 0, 0, 0, 0, $old_x , $old_y);


Jeżeli obrazek będzie przezroczysty i zostanie wstawiony w odpowiednie tło otrzymasz dobry efekt (ty chciałeś stworzyć plik przezroczysty a przecież można go zgrać z serwera). Oczywiście są to moje przypuszczenie chociaż powinno działać. Jedyny mankament jest taki że trzeba jakoś standaryzować wielkości wgrywanych plików (można łatwo to zrobić jeżeli chodzi o popularne rozmiary ale nic to nie da jeżeli będzie można wysłać każdy, chyba że doda się konwersję obrazka na inną rozdzielczość).

Pozdrawiam,
Piro
aio
imagealphablending($img, false);
imagesavealpha($img,true);
przed copy
Avatarus
Zadziałało, wielkie dzięki smile.gif
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.