Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z nakładaniem kilku obrazków png transparent
Forum PHP.pl > Forum > PHP
Czadus
Witam,

przeczytałem już dziesiątki stron szukając rozwiązania na mój problem i prawdę mówiąc, pomysłów mi już brakło, albo, po prostu rozwiązanie mam przed nosem jednak nie potrafię go poprawnie wykorzystać. Potrzebuję wykonać następującą operację, z kilku plików PNG zawierających przezroczystość, stworzyć jeden plik, np. jpg, po czym przekazać go bezpośrednio do klasy fpdf tworzącej plik PDF z zawartym wewnątrz, wcześniej utworzonym, obrazkiem.

Na chwilę obecną mój kod wygląda następująco:
Kod
header("Content-type: image/png");
        
$obrazek=ImageCreate(ustawienia::$modelWidth, ustawienia::$modelHeight);
    
for($i=0;$i<sizeof($images);++$i){
    $tess = imagecreatefrompng($images[$i]);
    
    list($width, $height, $type, $attr) = @getimagesize($images[$i]);
    imagealphablending($tess, true);
    imagesavealpha($tess, true);
    imagecopymerge($obrazek, $tess, 0, 0, 0, 0, $width, $height, 100);
}

imagepng($obrazek);
Kshyhoo
Też miałem ten problem, ale po nasiadówce dwutygodniowej udało mi się coś sklecić. Przykład nałożenia 3 grafik z zachowaniem przezroczystości:
  1. <?php
  2. $obraz1 = ($_GET['obraz1']);
  3. $obraz2 = ($_GET['obraz2']);
  4. $obraz3 = ($_GET['obraz3']);
  5. $temp = ($_GET['temp']);
  6. $name = ($_GET['name']);
  7.  
  8. $img1 = imagecreatefrompng("../graf3/$obraz1");
  9. $img2 = imagecreatefrompng("../graf3/$obraz2");
  10. $img3 = imagecreatefrompng("../graf3/$obraz3");
  11.  
  12. $imgX = imagecreatetruecolor(200, 200);
  13. imagealphablending($imgX, false);
  14. imagesavealpha($imgX, true);
  15. // x do // y do // x skad // y skad // x do ser // y do wys // x skad ser // y skad wys
  16. ImageCopyResampled($imgX,$img1, 0, 0, 0, 0, 72,200, 72,200);
  17. ImageCopyResampled($imgX,$img2, 72, 0, 72, 0, 56,200, 56,200);
  18. ImageCopyResampled($imgX,$img3,128, 0,128, 0, 72,200, 72,200);
  19.  
  20. header("Content-Type: image/png");
  21. imagealphablending($imgX, false);
  22. imagesavealpha($imgX, true);
  23. imagepng($imgX, NULL);
  24. imagepng($imgX, "../tymcz/$name.k2.png");
  25. chmod("../tymcz/$name.k2.png", 0666);
  26.  
  27. imagedestroy($img1);
  28. imagedestroy($img2);
  29. imagedestroy($img3);
  30. imagedestroy($imgX);
  31. ?>
Czadus
Dzięki za szybką odpowiedź, rzeczywiście, Twój kod pomógł, jednak nie we wszystkim. Oczywiście powstaje nowy obrazek png z przezroczystością, jednak z trzeba nakładanych, faktycznie naniesiony jest tylko jeden, ostatni w pętli. A mi zależy na tym, aby każdy naniesiony obrazek był widoczny poprawnie. Czy masz może na to radęquestionmark.gif Mój aktualny kod wygląda następująco:

Kod
$sizes='';

for($i=0;$i<sizeof($images);++$i){
    list($width, $height, $type, $attr) = getimagesize($images[$i]);
    $images[$i] = imagecreatefrompng($images[$i]);
    
    $sizes[$i][0]=$width;
    $sizes[$i][1]=$height;
}

$imgWidth=ustawienia::$modelWidth;
$imgHeight=ustawienia::$modelHeight;
if(sizeof($sizes)>0){
    $imgWidth=$sizes[0][0];
    $imgHeight=$sizes[0][1];
}

$obrazek = imagecreatetruecolor($imgWidth, $imgHeight);
imagealphablending($obrazek, false);
imagesavealpha($obrazek, true);

for($i=0;$i<sizeof($images);++$i) {
    ImageCopyResampled($obrazek ,$images[$i], 0, 0, 0, 0, $imgWidth, $imgHeight, $imgWidth, $imgHeight);
}

header("Content-Type: image/png");
imagealphablending($obrazek, false);
imagesavealpha($obrazek, true);
imagepng($obrazek, NULL);

for($i=0;$i<sizeof($images);++$i)
    imagedestroy($images[$i]);


W $images znajdują się ścieżki do plików png.
Kshyhoo
Kod, który Ci podałem właśnie to robi - nakłada po kolei kilka grafik i zapisuje jako jedną. Możesz to sprawdzić tu.
Czadus
I właśnie nie wiem, dlaczego u mnie widoczny jest ostatni z dołączanych grafik.... może gdzieś popełniłem błąd w tym kodzie.
Kshyhoo
Widocznie pobiera Ci tylko ostatni w pętli...
Czadus
Cytat(Kshyhoo @ 12.03.2010, 14:10:34 ) *
Widocznie pobiera Ci tylko ostatni w pętli...


No to na pewno, ale dlaczego, tego nie rozumiem..... Albo nadpisuje poprzednie?? Po skróceniu pętli, zawsze jest ostatni, jaki w pętli załadował......
Kshyhoo
Nie musisz tego robić w pętli (po za pobraniem obrazków). Z tego co widzę, Twoja pętla chodzi tylko raz, więc musisz przestawić } w inne miejsca ;p
Czadus
Każdy z poszczególnych plików png jest poprawnie nakładany w pętli, jednak, mimo poprawnie dodawanej przezroczystości, kolejny obrazek najpierw całkowicie przysłania poprzedni. A mi chodzi aby każdy był widoczny, wówczas z kilku grafik png stworzony zostanie jeden.
Kshyhoo
OK, spróbuj innej funkcji, odpowiedzialnej za nakładanie grafik godeł (4 godła na tarczy):
  1. <?php
  2. $godlo1 = ($_GET['godlo1']);
  3. $godlo2 = ($_GET['godlo2']);
  4. $godlo3 = ($_GET['godlo3']);
  5. $godlo4 = ($_GET['godlo4']);
  6. $name = ($_GET['name']);
  7.  
  8. $imgX=imagecreatefrompng("../tymcz/$name.k2.png");
  9. $img1=imagecreatefrompng("../graf7/$godlo1");
  10. $img2=imagecreatefrompng("../graf7/$godlo2");
  11. $img3=imagecreatefrompng("../graf7/$godlo3");
  12. $img4=imagecreatefrompng("../graf7/$godlo4");
  13.  
  14. imagecolortransparent($img1,imagecolorexact($img1,0,0,0));
  15. imagealphablending($img1, false); imagesavealpha($img1, true);
  16. imagecolortransparent($img2,imagecolorexact($img2,0,0,0));
  17. imagealphablending($img2, false); imagesavealpha($img2, true);
  18. imagecolortransparent($img3,imagecolorexact($img3,0,0,0));
  19. imagealphablending($img3, false); imagesavealpha($img3, true);
  20. imagecolortransparent($img4,imagecolorexact($img4,0,0,0));
  21. imagealphablending($img4, false); imagesavealpha($img4, true);
  22. // x do // y do // x skad // y skad // x do ser // y do wys // x skad ser // y skad wys
  23. ImageCopyResampled($imgX,$img1, 75, 37, 0, 0, 50, 50,200,200);
  24. ImageCopyResampled($imgX,$img2, 37, 75, 0, 0, 50, 50,200,200);
  25. ImageCopyResampled($imgX,$img3,112, 75, 0, 0, 50, 50,200,200);
  26. ImageCopyResampled($imgX,$img4, 75,112, 0, 0, 50, 50,200,200);
  27.  
  28. imagealphablending($imgX, false);
  29. imagesavealpha($imgX, true);
  30. header("Content-Type: image/png");
  31. imagepng($imgX, NULL);
  32. imagepng($imgX, "../tymcz/$name.png");
  33. chmod("../tymcz/$name.png", 0666);
  34.  
  35. imagedestroy($img1);
  36. imagedestroy($img2);
  37. imagedestroy($img3);
  38. imagedestroy($img4);
  39. imagedestroy($imgX);
  40. ?>
Czadus
Działa..... dzięki.....
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.