Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z imagecopy - rozmazane kolory
Forum PHP.pl > Forum > PHP
IProSoft
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



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

Kshyhoo
Pozwól, że i ja wkleję obrazek:

Mam nadzieję, że jesteś domyślny...
IProSoft
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 );
Kshyhoo
HexToRGB, jest taka funkcja?
IProSoft
Konwertująca kolor z postaci HEX na tablicę RGB
  1. 'r' => ?,
  2. 'g' => ?,
  3. 'b' => ?
  4. )
Kshyhoo
Nie widzę jej w manualu.
trueblue
IProSoft,
wrzuć gdzieś do pobrania image.jpg oraz wynik jaki otrzymujesz.
IProSoft
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
Kshyhoo
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
trueblue
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.
IProSoft
@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
Kshyhoo
Wygeneruj zielony kwadrat a na niego nałóż swój obrazek...
IProSoft
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ę :-)
kartin
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.
Kshyhoo
Ale użyj ImageCopyResampled.
IProSoft
@Kshyhoo - to nic nie zmieni.

@kartin - dzięki za konkret, rozumiem, że nie ma obejścia tego w PHP ?
IProSoft
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.
kartin
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.
IProSoft
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.
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.