Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Image GD - samoczynna zmiana kolorów i jakości.
Forum PHP.pl > Forum > Przedszkole
desavil
Witajcie!

Mam zrobiony skrypt, który zmniejsza rozmiar obrazku jeżeli jego szerokość jest większa niż X.
Następnie tworzony jest nowy obrazek z białym tłem o takich samych wymiarach jak pomniejszony, tymże wysokość jego jest o 37px większa.
Na stworzone tło wstawiany jest zmniejszony obrazek, na samej górze, a w prawym dolnym rogu obrazek tzw. watermark o wysokości 35px.

Problem jest w tym, iż od momentu stworzenia tła (pustego obrazka, na który wszystko jest wklejane) to cały obrazek albo zmienia barwy, albo jest złej jakości lub czarno-biały. Nie wiem dlaczego tak się dzieje. Poniżej przedstawiam dwa obrazki do porównania:
Obrazek oryginalny: http://img209.imageshack.us/img209/8352/heheo.jpg
Obrazek przepuszczony przez skrypt: http://img39.imageshack.us/img39/5918/change.jpg

Kawałek kodu, który odpowiada za stworzenie nowego obrazka i połączenie ich wszystkich:
  1. $MAX_NEW_WIDTH = 676;
  2. $MAX_NEW_HEIGHT = 10000;
  3. if($fileName_type2[0] > $MAX_NEW_WIDTH){
  4. list($width, $height) = $fileName_type2;
  5. $scale = min($MAX_NEW_WIDTH/$width, $MAX_NEW_HEIGHT/$height);
  6. $new_width = floor($scale*$width);
  7. $new_height = floor($scale*$height);
  8. }else{ $new_width = $fileName_type2[0]; $new_height = $fileName_type2[1]; $width = $fileName_type2[0]; $height = $fileName_type2[1]; }
  9. if($fileName_type2['mime'] == 'image/png'){ $source = imagecreatefrompng($fileTmp); }else{ $source = imagecreatefromjpeg($fileTmp); }
  10. $dest = imagecreatetruecolor($new_width, $new_height);
  11. imagecopyresized($dest, $source, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
  12.  
  13. $image1 = imagecreatefrompng('media/mark.png');
  14. $plik_w = imagesx($dest);
  15. if($plik_w < 249){ $plik_w_change = 249-$plik_w; $plik_w = $plik_w+$plik_w_change; }
  16. $plik_h = imagesy($dest)+37;
  17.  
  18. // START - Stworzenie obrazka, jeżeli pominę ten krok, kolory pozostają bez zmiany, prawidłowe są
  19. $obrazek111 = imagecreate($plik_w, $plik_h);
  20. imagecolorallocate($obrazek111, 255, 255, 255);
  21. imagecopy($obrazek111, $dest, 0, 0, 0, 0, imagesx($dest), imagesy($dest));
  22. // KONIEC
  23.  
  24. $znaczek_w = imagesx($image1);
  25. $znaczek_h = imagesy($image1);
  26. $od_x = $plik_w-$znaczek_w;
  27. $od_y = $plik_h-$znaczek_h;
  28. imagecopy($obrazek111, $image1, $od_x, $od_y, 0, 0, $znaczek_w, $znaczek_h);
  29. if($fileName_type2['mime'] == 'image/png'){ imagepng($obrazek111,'media/'.$file_change); }else{ imagejpeg($obrazek111,'media/'.$file_change); }
  30. imagedestroy($image1);
  31. imagedestroy($obrazek111);
  32. unlink($fileTmp);

Z góry dziękuję za pomoc.
ciekawskiii
nie jestem pewny ale spróbuj wywalić 20 linie
desavil
Próbowałem, nic nie daje, tylko kolor tła inny.
ciekawskiii
to nie mam pojęcia a nie chce mi sie do siebie wrzucac kodu i sprawdzac. Kiedys robilem cos podobnego ale z kolorami problemu nie mialem.
Jedyne co mi przychodzi do glowy to zamiana imagecreate w linii 19 na imagecreatetruecolor()
desavil
Dzięki, jesteś WIELKI :]
Tylko kolor tła teraz się nie zmienia, jest czarny a ma być miały.
ciekawskiii
teraz wywal imagecolorallocate bo ta funkcja tworzy tło a imagecreatetruecolor pobiera rzeczywiste kolory
desavil
Zostawiłem tak:
  1. $plik_h = imagesy($dest)+37;
  2.  
  3. $obrazek111 = imagecreatetruecolor($plik_w, $plik_h);
  4. imagecopy($obrazek111, $dest, 10, 10, 0, 0, imagesx($dest), imagesy($dest));

Teraz w jaki sposób mogę nadać kolor tłu?

@edit:
Zrobiłem za pomocą:
  1. $plik_h = imagesy($dest)+37;
  2.  
  3. $obrazek111 = imagecreatetruecolor($plik_w, $plik_h);
  4. $obrazek112 = imagecolorallocate($obrazek111, 245, 245, 245);
  5. imagefill($obrazek111, 0, 0, $obrazek112);
  6. imagecopy($obrazek111, $dest, 10, 10, 0, 0, imagesx($dest), imagesy($dest));
ciekawskiii
ehh sam juz sie pogubilem.
Nie zostawia Ci rzeczywistego koloru tla teraz? powinno być ok
edit:
Ale jak bedziesz mial czarne tlo to Ci zmieni na biale i tez nie bedzie ok
desavil
Dobrze jest, cały czas białe daje. smile.gif
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.