Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [GD2] Przeźroczystość PNG
Forum PHP.pl > Forum > PHP
deha21
Witam,
Szukałem na forum i na necie informacji na ten temat, niestety żadne z podanych porad nie rozwiązało mojego problemu. Żadne imagealphablending, imagecolorallocatealpha, imagesavealpha nic nie robi. Może coś źle robię?

Mam skrypt który zmniejsza zdjęcia do podanych rozmiarów. Przy przeźroczystych plikach PNG tło zamienia się na czarne. Jak zrobić żeby tło wciąż było przeźroczyste?

Oto kod:
  1. function resize($image_file, $new_width, $new_height, $file_name, $quality){
  2. $info = getimagesize($image_file);
  3. if($info === false)
  4. return false;
  5. $img = null;
  6. switch($info[2]){
  7. case IMAGETYPE_JPEG:
  8. $img = imagecreatefromjpeg($image_file);
  9. break;
  10. case IMAGETYPE_GIF:
  11. $img = imagecreatefromgif($image_file);
  12. break;
  13. case IMAGETYPE_PNG:
  14. $img = imagecreatefrompng($image_file);
  15. break;
  16. default:
  17. return false;
  18. }
  19. $th = imagecreatetruecolor($new_width, $new_height);
  20. imagecopyresampled($th, $img, 0, 0, 0, 0, $new_width, $new_height, $info[0], $info[1]);
  21.  
  22. switch($info[2]){
  23. case IMAGETYPE_JPEG:
  24. imagejpeg($th, $file_name.'.jpg', $quality);
  25. break;
  26. case IMAGETYPE_GIF:
  27. imagegif($th, $file_name.'.gif');
  28. break;
  29. case IMAGETYPE_PNG:
  30. imagepng($th, $file_name.'.png');
  31. break;
  32. }
  33. imagedestroy($th);
  34. imagedestroy($img);
  35. return true;
  36. }
Kshyhoo
Spróbuj pokombinować poniższy sposób:
  1. $imgX = imagecreatetruecolor(200, 200);
  2. imagealphablending($imgX, false);
  3. imagesavealpha($imgX, true);

lub:
  1. header("Content-Type: image/png");
  2. imagealphablending($imgX, false);
  3. imagesavealpha($imgX, true);
deha21
Wielkie dzięki działa pierwszy sposób biggrin.gif

Hmm... a jest coś co działa na GIF? Bo w GIFie też czarne tło się robi.
wookieb
imagealphablending na true.
imagesavealpha nie dajesz. Jeżeli coś bedzie nie tak to pisz
deha21
Działa. Myślałem, że nie działa ale pomyliłem kolejność i teraz jest ok. Dzięki biggrin.gif

Kurde osobno dla PNG i GIFów działa ale gdy chcę to rozdzielić na 'jeżeli GIF to sposób taki, jeżeli PNG to taki' wszystko się pasuje :/
  1. $th = imagecreatetruecolor($new_width, $new_height);
  2.  
  3. switch($info[2]){
  4. case IMAGETYPE_JPEG:
  5. imagecopyresampled($th, $img, 0, 0, $x1, $y1, $w, $h, $w, $h);
  6. imagejpeg($th, $image_file, 95);
  7. break;
  8. case IMAGETYPE_GIF:
  9. imagealphablending($th, true);
  10. imagecopyresampled($th, $img, 0, 0, $x1, $y1, $w, $h, $w, $h);
  11. imagegif($th, $image_file);
  12. break;
  13. case IMAGETYPE_PNG:
  14. imagealphablending($th, false);
  15. imagesavealpha($th, true);
  16. imagecopyresampled($th, $img, 0, 0, $x1, $y1, $w, $h, $w, $h);
  17. imagepng($th, $image_file);
  18. break;
  19. }
wookieb
A sprawdź czy na pewno wykonują się odpowiednie linie kodu w zależności od typu zdjęcia. Dodatkowo porównaj sobie czy aby na pewno twój kod jest "taki sam" jak twoje poszczególne próby.
Kshyhoo
Cytat(deha21 @ 8.10.2009, 15:26:22 ) *
Kurde osobno dla PNG i GIFów działa ale gdy chcę to rozdzielić na 'jeżeli GIF to sposób taki, jeżeli PNG to taki' wszystko się pasuje :/

Zrób to w osobnych plikach i inkluduj...
deha21
Wiem co mi skomplikowało sprawę. Mam dwa pliki - jeden od kadrowania a drugi od resize'u zdjęć. Niechąco z jednego przekopiowałem kawałek kodu z drugiego i dlatego się psuło. Teraz już wszystko poprawiłem. Jednak dla GIFów nie działa dalej - dziwne bo wcześniej działało :/

  1. switch($info[2]){
  2. case IMAGETYPE_JPEG:
  3. imagecopyresampled($th, $img, 0, 0, 0, 0, $new_width, $new_height, $info[0], $info[1]);
  4. imagejpeg($th, $image_file, 95);
  5. break;
  6. case IMAGETYPE_GIF:
  7. imagealphablending($th, true);
  8. imagecopyresampled($th, $img, 0, 0, 0, 0, $new_width, $new_height, $info[0], $info[1]);
  9. imagegif($th, $image_file);
  10. break;
  11. case IMAGETYPE_PNG:
  12. imagealphablending($th, false);
  13. imagesavealpha($th, true);
  14. imagecopyresampled($th, $img, 0, 0, 0, 0, $new_width, $new_height, $info[0], $info[1]);
  15. imagepng($th, $image_file);
  16. break;
  17. }
krakiewicz.pl
Zbadaj sprawę z ImageMagick, jest bardziej rozbudowane niż GD:
http://www.php.net/manual/en/book.imagick.php
http://www.phpro.org/tutorials/Imagick.html

Opisałem na swoim blogu jak łączyć warstwy PNG ze sobą oraz zmieniać kolor tła.
http://krakiewicz.pl/png-laczenie-obrazow-...php-imagemagick
Mrokodajny
Mam następującą prościutką funkcyjkę resajzującą wyłącznie gify i jest tak problem bo pojawia się czarne tło i nie wiem o co chodzi:


  1. function resize($image_file, $new_width, $new_height, $file_name)
  2. {
  3. $img = imagecreatefromgif($image_file);
  4. $x=imagesx($img);
  5. $y=imagesy($img);
  6. $th = imagecreatetruecolor($new_width, $new_height);
  7. imagealphablending($th, true);
  8. imagecopyresampled($th, $img, 0, 0, 0, 0, $new_width, $new_height, $x, $y);
  9. imagegif($th, $file_name);
  10. imagedestroy($th);
  11. imagedestroy($img);
  12. return true;
  13. }
  14.  

uprzejmie proszę o pomoc co źle robię
z góry dziękuję za pomoc
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.