Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: imagecopy - Czarne pasy podczas ujemnych współrzędnych $src_x i $src_y
Forum PHP.pl > Forum > PHP
adbacz
Używam funkcji imagecopy, którą nakładam jedno zdjęcie na drugie - $dest na $dest2. $dest jest obrazem stworzonym przez GD w 100% przeźroczyste a $dest2 jest obrazkiem z elementami przeźroczystości. Przesuwam $dest2 względem wierzchołka X0;Y0 zdjęcia $dest o -10 i -10 pikseli tak, by przesunął się w dół i w prawo. Niestety, mimo, że oba zdjęcia mają w sobie przeźroczystość, to zdjęcie dostaje czarne pasy na górze i po lewej stronie - czyli w miejscach z których zostało przesunięte, poniżej zdjęcie rezultatu:



Zdjęcie oryginalne:



Kod:
  1. imagecopy($dest, $dest2, 0, 0, $sourceCoordinateX, $sourceCoordinateY, $sourceWidth, $sourceHeight);


Jakie mogą być tego przyczyny? Zauważcie, że przeźroczystość obrazka nadal jest (w okół słoneczka), ale pasy dodawane są w miejscach w których obrazek został odsunięty współrzędnymi.
Kshyhoo
Obydwie grafiki muszą mieć przezroczystość. Spróbuj pokombinować tak:
  1. imagealphablending($img, false);
  2. imagesavealpha($img, true);
adbacz
Już tak robiłem. I na $dest i na $dest2. Cały czas to samo.

Już nawet nadawałem transparentność w ten sposób:

  1. $transparent = imagecolorallocatealpha($dest, 0, 0, 0, 127);
  2. imagefill($dest, 0, 0, $transparent);


Jest jeszcze jedna zawiłość, że tak powiem. Obrazek przeźroczysty stworzony przez GD w przeglądarce jest przeźroczysty, zapisany na komputerze i otwarty jest przeźroczysty, ale otwarty Photoshopem jest... czarny ;|
Kshyhoo
Pokaż cały kod.
adbacz
  1. $dest = imagecreatetruecolor($sourceWidth, $sourceHeight);
  2.  
  3. imagealphablending($dest, false);
  4. imagesavealpha($dest, true);
  5.  
  6. $transparent = imagecolorallocatealpha($dest, 0, 0, 0, 127);
  7. imagefill($dest, 0, 0, $transparent);
  8. unset($transparent);
  9.  
  10. imagecopy($dest, $dest2, 0, 0, (int) $sourceCoordinateX, (int) $sourceCoordinateY, $sourceWidth, $sourceHeight);
Kshyhoo
Ale to nie jest cały kod, nie che mi się kombinować ;p
adbacz
Ale w jakim sensie kombinować? I w jakim sensie nie jest kompletny?

Mogę Ci podstawić wartości pod zmienne:

  1. $sourceWidth = 400;
  2. $sourceHeight = 500;
  3. $sourceCoordinateX = - 10;
  4. $sourceCoordinateY = - 10;
Kshyhoo
  1. $dest2 = imagecreatefrompng("test01.png");
  2.  
  3. $dest = imagecreatetruecolor(400, 500);
  4. imagealphablending($dest, false);
  5. imagesavealpha($dest, true);
  6.  
  7. $transparent = imagecolorallocatealpha($dest, 0, 0, 0, 127);
  8. imagefill($dest, 0, 0, $transparent);
  9. //unset($transparent);
  10.  
  11. //ImageCopyResampled($dest,$dest2, 10, 10, 0, 0,200,200,200,200);
  12. imagecopy($dest, $dest2, 10, 10, 0, 0, $sourceWidth, $sourceHeight);
  13.  
  14. header("Content-Type: image/png");
  15. imagealphablending($dest, false);
  16. imagesavealpha($dest, true);
  17. imagepng($dest, NULL);
  18.  
  19. imagedestroy($dest2);
  20. imagedestroy($dest);
adbacz
Fantastycznie! Działa idealnie! Dziękuję Ci za pomoc!
Kshyhoo
Spoko smile.gif
adbacz
Mam jeszcze jedno pytanie. Dlaczego podanie ujemnych współrzędnych źródła sprawia, że dodają się czarne pasy, a gdy poda się dodatnie celu to jest ok?
Kshyhoo
Bo tylko $dest ma przezroczystość.
adbacz
Zadziałało po zmianie współrzędnych. Jeśli X lub Y są ujemne to zamieniałem miejscami współrzedne źródła i celu. Ale gdy obrazek $desc jest mniejszy niż $desc2 i jest wycentrowany, to pasy pojawiają się tym razem na dole i po prawej stronie, jak poniżej:

Zielone obramowanie pokazuje granice obrazka

Kod:

  1. $sourceWidth = 700;
  2. $sourceHeight = 700;
  3.  
  4. $dstX = 0;
  5. $dstY = 0;
  6. $srcX = 100;
  7. $srcY = 100;
  8.  
  9.  
  10. if($sourceCoordinateX > 0)
  11. {
  12. $dstX = $sourceCoordinateX;
  13. $srcX = 0;
  14. }
  15.  
  16. if($sourceCoordinateY > 0)
  17. {
  18. $dstY = $sourceCoordinateY;
  19. $srcY = 0;
  20. }
  21.  
  22. imagecopy($dest, $dest2, $dstX, $dstY, $srcX, $srcY, $sourceWidth, $sourceHeight);
Kshyhoo
Proponuję użyć funkcji ImageCopyResampled, która wydaje mi się nieco "mądrzejsza" tongue.gif
adbacz
Już doszedłem dlaczego tak się dzieje. W dwóch ostatnich parametrach trzeba podać wymiary obrazka oryginalnego (w tym wypadku słoneczka) zamiast wymiarów zaznaczenia:

  1. imagecopy($dest, $dest2, $dstX, $dstY, $srcX, $srcY, imagesx($dest2), imagesy($dest2));
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.