Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> imagecopy - Czarne pasy podczas ujemnych współrzędnych $src_x i $src_y
adbacz
post 7.01.2014, 11:26:37
Post #1





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Kshyhoo
post 7.01.2014, 11:48:52
Post #2





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Obydwie grafiki muszą mieć przezroczystość. Spróbuj pokombinować tak:
  1. imagealphablending($img, false);
  2. imagesavealpha($img, true);


--------------------
Go to the top of the page
+Quote Post
adbacz
post 7.01.2014, 11:56:54
Post #3





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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 ;|
Go to the top of the page
+Quote Post
Kshyhoo
post 7.01.2014, 12:00:25
Post #4





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Pokaż cały kod.


--------------------
Go to the top of the page
+Quote Post
adbacz
post 7.01.2014, 12:20:10
Post #5





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


  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);
Go to the top of the page
+Quote Post
Kshyhoo
post 7.01.2014, 12:25:01
Post #6





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Ale to nie jest cały kod, nie che mi się kombinować ;p


--------------------
Go to the top of the page
+Quote Post
adbacz
post 7.01.2014, 12:28:32
Post #7





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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;


Ten post edytował adbacz 7.01.2014, 12:31:53
Go to the top of the page
+Quote Post
Kshyhoo
post 7.01.2014, 12:57:01
Post #8





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




  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);


--------------------
Go to the top of the page
+Quote Post
adbacz
post 7.01.2014, 13:09:45
Post #9





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


Fantastycznie! Działa idealnie! Dziękuję Ci za pomoc!
Go to the top of the page
+Quote Post
Kshyhoo
post 7.01.2014, 13:11:49
Post #10





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Spoko smile.gif


--------------------
Go to the top of the page
+Quote Post
adbacz
post 7.01.2014, 13:45:01
Post #11





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Kshyhoo
post 7.01.2014, 13:53:14
Post #12





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Bo tylko $dest ma przezroczystość.


--------------------
Go to the top of the page
+Quote Post
adbacz
post 7.01.2014, 15:48:37
Post #13





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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);


Ten post edytował adbacz 7.01.2014, 15:59:03
Go to the top of the page
+Quote Post
Kshyhoo
post 7.01.2014, 16:04:40
Post #14





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Proponuję użyć funkcji ImageCopyResampled, która wydaje mi się nieco "mądrzejsza" tongue.gif


--------------------
Go to the top of the page
+Quote Post
adbacz
post 7.01.2014, 16:20:42
Post #15





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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));


Ten post edytował adbacz 7.01.2014, 16:21:00
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.06.2025 - 22:02