Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z imagecopy - rozmazane kolory, imagecopy/imagecopymerge
IProSoft
post
Post #1





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


Witam

Mam problem z edycją/tworzeniem obrazów w Pa a mianowicie po wypełnieniu obrazu tłem i nałożeniu na niego innego obrazu wychodzą kwiatki.

Screen: http://scr.hu/3k8r/zvgky

(IMG:http://screenshu.com/static/uploads/temporary/j8/iv/d5/5g2jym.jpg)

Kolor czarny + różowy to pierwszy obraz, a zielony to "podkład".

To co chciałbym uzyskać to efekt po prawej stronie SS, a obecny po lewej. Jak widać kolory są rozmazane.

Obrazki nie są poddawane żadnemu przekształceniu itp., nakładanie odbywa się przez imagecopy/imagecpymerge.

Czy ktoś spotkał się z podobnym problemem i znalazł rozwiązanie ?

Pozdrawiam

Go to the top of the page
+Quote Post
Kshyhoo
post
Post #2





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




Pozwól, że i ja wkleję obrazek:
(IMG:http://historia.focus.pl/upload/galleries/1/fot-corbis-archiwum-autora-1199_l.jpg)
Mam nadzieję, że jesteś domyślny...
Go to the top of the page
+Quote Post
IProSoft
post
Post #3





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


Po to się rozpisałem aby nekreślić problem bo kod jest banalny i spodziewałem się, odpowiedzi osób, które miały podobny problem na poziomie ogólnym( kolory w PHP ) a nie konkretnego kodu.

Ale skoro tak to proszę:

  1. /** Obraz z różową ramką **/
  2. $img = imagecreatefromjpeg( 'image.jpg' );
  3. $border = 5;
  4.  
  5. $image = imagecreatetruecolor( $width + 2 * $border, $height + 2 * $border );
  6.  
  7. /* Zielone wypełnienie */
  8. $color = HexToRGB( '#12a312' );
  9. imagefilledrectangle( $image, 0, 0, $width + 2 * $border, $height + 2 * $border, imagecolorallocate( $image, $color['r'], $color['g'], $color['b'] ) );
  10.  
  11. imagecopy( $image, $img, $border, $border, 0, 0, $width, $height );
  12.  
  13. imagejpeg( $image, 'image_2.jpg', 100 );


Ten post edytował IProSoft 29.05.2015, 18:48:17
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #4





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




HexToRGB, jest taka funkcja?
Go to the top of the page
+Quote Post
IProSoft
post
Post #5





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


Konwertująca kolor z postaci HEX na tablicę RGB
  1. 'r' => ?,
  2. 'g' => ?,
  3. 'b' => ?
  4. )
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #6





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




Nie widzę jej w manualu.
Go to the top of the page
+Quote Post
trueblue
post
Post #7





Grupa: Zarejestrowani
Postów: 6 809
Pomógł: 1828
Dołączył: 11.03.2014

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


IProSoft,
wrzuć gdzieś do pobrania image.jpg oraz wynik jaki otrzymujesz.

Ten post edytował trueblue 29.05.2015, 19:46:55
Go to the top of the page
+Quote Post
IProSoft
post
Post #8





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


Cytat(Kshyhoo @ 29.05.2015, 20:41:03 ) *
Nie widzę jej w manualu.

To własna funkcja, nieistotna dla przykładu.

Obrazki: https://www.dropbox.com/sh/5cf18bjaz9liyer/...Q-bCDwLbPa?dl=0

Ten post edytował IProSoft 29.05.2015, 20:00:51
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #9





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




Chcesz dodać tylko tę zieloną ramkę?
  1. <?php
  2. /** Obraz z różową ramką **/
  3. $img = imagecreatefromjpeg( 'image.jpg' );
  4. $border = 5;
  5. $width = 370;
  6. $height = 370;
  7.  
  8. $image = imagecreatetruecolor( $width + 2 * $border, $height + 2 * $border );
  9.  
  10. /* Zielone wypełnienie */
  11. //$color = HexToRGB( '#12a312' );
  12. $color['r'] = 18;
  13. $color['g'] = 163;
  14. $color['b'] = 18;
  15.  
  16. imagefilledrectangle( $image, 0, 0, $width + 2 * $border, $height + 2 * $border, imagecolorallocate( $image, $color['r'], $color['g'], $color['b'] ) );
  17.  
  18. imagecopy( $image, $img, $border, $border, 0, 0, $width, $height );
  19.  
  20. imagejpeg( $image, 'image_2.jpg', 100 );
  21.  
  22. header('Content-Type: image/jpeg');
  23.  
  24. ?>

http://zapodaj.net/737b42cd2cfed.png.html
Go to the top of the page
+Quote Post
trueblue
post
Post #10





Grupa: Zarejestrowani
Postów: 6 809
Pomógł: 1828
Dołączył: 11.03.2014

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


Cytat(IProSoft @ 29.05.2015, 21:00:36 ) *

Jak dla mnie jest to efekt kompresji JPEG, spróbuj generować w innym formacie i porównać wynik.
Go to the top of the page
+Quote Post
IProSoft
post
Post #11





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


@Kshyhoo - sory za edycję, źle spojrzałem. Nie tyle ramkę co połaczyć dwa obrazki jednak wynik ma być w jpg

@trueblue - z png nie ma tego problemu, jednak zależy mi na działaniu tylko na plikach jpg

Ten post edytował IProSoft 29.05.2015, 20:32:26
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #12





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




Wygeneruj zielony kwadrat a na niego nałóż swój obrazek...
Go to the top of the page
+Quote Post
IProSoft
post
Post #13





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


Cytat(Kshyhoo @ 29.05.2015, 21:38:21 ) *
Wygeneruj zielony kwadrat a na niego nałóż swój obrazek...

Jak zapewno spojrzałeś na kod, to robię :-)
Go to the top of the page
+Quote Post
kartin
post
Post #14





Grupa: Zarejestrowani
Postów: 246
Pomógł: 79
Dołączył: 25.05.2010

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


Problem nie leży w imagecopy() a w imagejpeg(). W trakcie kompresji JPEG podczas transformacji koloru RGB na YCbCr stosowane jest próbkowanie 4:2:0 (rozdzielczość pionowa i pozioma Cr i Cb jest zmniejszana o połowę), gdyby było 4:4:4 (rozdzielczość bez zmian) to obraz byłby wyraźny, jednak produkowane są mniejsze pliki kosztem jakości. Przy próbkowaniu 4:2:2 tylko pionowe lub poziome (zależnie od stosowanej metody) krawędzie byłyby dobre.
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #15





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




Ale użyj ImageCopyResampled.
Go to the top of the page
+Quote Post
IProSoft
post
Post #16





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


@Kshyhoo - to nic nie zmieni.

@kartin - dzięki za konkret, rozumiem, że nie ma obejścia tego w PHP ?
Go to the top of the page
+Quote Post
trueblue
post
Post #17





Grupa: Zarejestrowani
Postów: 6 809
Pomógł: 1828
Dołączył: 11.03.2014

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


http://www.phpimagick.com/Imagick/setSamplingFactors
Go to the top of the page
+Quote Post
IProSoft
post
Post #18





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


Użycie Imagick niestety odpada, musiało by to być w domyślnej funkcji. Imagick nie jest dostepny wszędzie, tj na kazdym serwerze, a kod musi być uniwersalny.
Go to the top of the page
+Quote Post
kartin
post
Post #19





Grupa: Zarejestrowani
Postów: 246
Pomógł: 79
Dołączył: 25.05.2010

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


Nic nie wiem, aby była możliwość obejścia tego w GD.

GD też jest opcjonalnym rozszerzeniem i możesz trafić na serwer bez obsługi.
ImageMagick jest w miarę powszechny. Przed chwilą testowałem na 4 różnych hostingach i we wszystkich był. W Gmagick też jest dostępna możliwość ustawiania próbkowania. Zatem masz już dwa alternatywne rozszerzenia. Możesz zrobić sobie dodatkową warstwę abstrakcji dla używanych funkcji graficznych, a w niej korzystać z najlepszego dostępnego na danym serwerze rozwiązania.

Ostatecznie możesz próbować generować do png lub bmp a później konwertować do jpeg, wywołaniem ze skryptu zewnętrznego programu.

Ten post edytował kartin 29.05.2015, 23:20:24
Go to the top of the page
+Quote Post
IProSoft
post
Post #20





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


Przeszukałem, przeczytałem i doszedłem do tego samego wniosku :-)

GD jest raczej zawsze i nie spotkałem się z jego brakiem, jak np. bywało to z ImageMagick ale mimo wszystko wykonam dodatkowe klasy dla GD/ImageMagick z opcjami do zmian na obrazach.

Dzięki za wszystkie odpowiedzi.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 25.12.2025 - 18:25