Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Jakość zeskalowanych zdjęć?
Forum PHP.pl > Forum > Przedszkole
kukix
Witam.

Podczas skalowania zdjęć okazało sie, że zmniejszone zdjęcia są słavbej jakości.. oryginały z których tworze miniaturki są już skompresowane, jednak skalując to samo zdjęcie w photoshopie, zdjęcie wygląda dużo dużo ładniej..

Moja funkcja skalująca zdjęcia:

  1. function zaladuj_zdjecie_robot($id, $plik_temp, $zdj_glowne_temp, $format, $max_id_parametr) {//funkcja ładuje tymczasowe zdjęciai tworzy miniaturki
  2. global $dbprefix;
  3. global $cfg;
  4.  
  5. $sciezka = "../zdjecia/";
  6. $max_id_zdj = oblicz_max_zdj('zdjecia','zdj_id',$id);//zwraca największy numer id +1
  7. $nazwa_pliku = $id.'_'.$max_id_zdj.'.'.$format;//składamy nazwe pliku
  8.  
  9.  
  10. if (!copy($plik_temp,$sciezka.$nazwa_pliku)) {
  11. print('Zdjęcie '.$id.' nie zostało załadowane poprawnie.');
  12.  
  13. } else {
  14.  
  15. print('Zdjęcie załądwane');
  16.  
  17. $max_szerokosc = 1000;//zdjęcie duże
  18. $max_wysokosc = 1200;
  19. zmien_wielkosc($id, $max_szerokosc, $max_wysokosc, $nazwa_pliku, $sciezka, '', $format);// ograniczenie wielkości największego zdjęcia
  20.  
  21. $max_szerokosc = 320;//zdjęcie małe
  22. $max_wysokosc = 360;
  23. zmien_wielkosc($id, $max_szerokosc, $max_wysokosc, $nazwa_pliku, $sciezka, 'smal/', $format);//srednie zdjęcie
  24.  
  25. $max_szerokosc_normal = 150;//zdjęcie średnie
  26. $max_wysokosc_normal = 160;
  27. zmien_wielkosc($id, $max_szerokosc_normal, $max_wysokosc_normal, $nazwa_pliku, $sciezka, "normal/", $format);//małe zdjęcie
  28.  
  29. //jezeli orginał jest większy niż średnie, kasujemy orginał.
  30. if (file_exists($sciezka.$nazwa_pliku)) {//sprawdzamy wielkośc orginału
  31. $rozmiar=GetImageSize($sciezka.$nazwa_pliku);
  32. $szerokosc_org=$rozmiar[0];
  33. $wysokosc_org=$rozmiar[1];
  34. }
  35.  
  36. if(($max_wysokosc_normal >= $wysokosc_org) && ($max_szerokosc_normal >= $szerokosc_org)) {
  37. unlink($sciezka.$nazwa_pliku);
  38. }
  39. }
  40. }//end function
  41.  
  42. function zmien_wielkosc($id, $max_szerokosc, $max_wysokosc, $nazwa_pliku, $sciezka, $sciezka_2, $format) {//zmienia wielkośc orginału
  43.  
  44. if (!is_dir ($sciezka.$sciezka_2)) {
  45. mkdir($sciezka.$sciezka_2, 0777);
  46. }
  47. $rozmiar=GetImageSize($sciezka.$nazwa_pliku);
  48.  
  49. $szerokosc=$rozmiar[0];
  50. $wysokosc=$rozmiar[1];
  51.  
  52. $wspolczynnik_x=$max_szerokosc/$szerokosc;
  53. $wspolczynnik_y=$max_wysokosc/$wysokosc;
  54.  
  55. if(($szerokosc<=$max_szerokosc)&&($wysokosc<=$max_wysokosc)) {
  56. $nowa_szerokosc=$szerokosc;
  57. $nowa_wysokosc=$wysokosc;
  58. } else if (($wspolczynnik_x*$wysokosc)<$max_wysokosc) {
  59. $nowa_wysokosc=ceil($wspolczynnik_x*$wysokosc);
  60. $nowa_szerokosc=$max_szerokosc;
  61. } else {
  62. $nowa_szerokosc=ceil($wspolczynnik_y*$szerokosc);
  63. $nowa_wysokosc=$max_wysokosc;
  64. }
  65.  
  66. switch($format) {
  67.  
  68. case 'jpg':
  69. case 'jpeg'://to chyba niepotrzenbe
  70. $zrd=ImageCreateFromJpeg($sciezka.$nazwa_pliku);
  71. break;
  72.  
  73. //inne formaty pozniej
  74.  
  75. }
  76.  
  77. $prz=@ImageCreateTrueColor($nowa_szerokosc, $nowa_wysokosc);
  78. @ImageCopyResampled($prz, $zrd, 0, 0, 0, 0, $nowa_szerokosc, $nowa_wysokosc, $szerokosc, $wysokosc);
  79.  
  80. switch($format) {
  81.  
  82. case 'jpg':
  83. case 'jpeg'://to chyba niepotrzenbe
  84. ImageJpeg($prz, $sciezka.$sciezka_2.$nazwa_pliku, 90);
  85. break;
  86.  
  87. //inne formaty pozniej
  88. }
  89.  
  90. }//end function


Czy użyte tutaj mechanizmy modyfikacji zdjęć są optymalne?
Czy w php da się otrzymać lepszą jakość skalowanych fotek?
Crozin
Na początek proponowałbym skorzystać z ImageMagicka, zamiast GD.
kukix
Cytat(Crozin @ 14.05.2012, 12:18:00 ) *
Na początek proponowałbym skorzystać z ImageMagicka, zamiast GD.

Dobrze, zapoznam się z tym tematem.. mam tylko krótkie pytanie.. czy funkcje te są dostepne standardowo na serwerach php, czy będzie raczej z tym problem?

Czy polepszenie jakości zdjęcia będzie widoczna?
Crozin
Cytat
[...] czy funkcje te są dostepne standardowo na serwerach php, czy będzie raczej z tym problem?
Imagick nie jest aż tak popularny na hostingach jak GD, ale w tego co się orientuję na sporej ich ilości jest dostępny.

Zresztą i tak powinieneś użyć jakiejś w miarę normalnej biblioteki do podstawowych operacji na obrazach (np. Imagine), która zapewnia warstwę abstrakcji nad dostępnymi w PHP rozszerzeniami. W ten sposób wykorzystasz Imagicka, bądź GD w jednym projekcie w zależności od ich dostępności na serwerze.
kukix
Pokazuje mi się komunikat:
Cytat
Fatal error: Class 'Imagick' not found in...


Czyli nie mam na serwerze imagicka? Mój serwer jest załozony w firmie nq.pl ten sam co to forum.
Crozin
Na to by wyglądało. Tak więc raczej pozostaje Ci tylko GD (bo raczej wątpię w dostępność Gmagicka przy braku Imagicka). Swoją drogą mógłbyś pokazać zdjęcie przed i po zmianie rozmiaru? Oraz jak wpływa zmiana jakości z 90 na 100 w kontekście rozmiaru i jakości pliku?
kukix
Ostatecznie przygotowałem nastepujący kod:

  1.  
  2. $poziom_kompresji_jpg = 90;
  3.  
  4. $img = new Imagick();
  5. $img->readImage($plik_zrodlo);
  6.  
  7. $poziom_kompresji_jpg = max(min($poziom_kompresji_jpg, 100), 1);//sprawdzamy czy miesci sie w widelkach
  8. $img->setImageCompression(imagick::COMPRESSION_JPEG);
  9. $img->setImageCompressionQuality($poziom_kompresji_jpg);
  10.  
  11. $img->ThumbnailImage(floatval($max_szerokosc), floatval($max_wysokosc), true);
  12.  
  13. $img->stripImage();
  14. $img->writeImage($plik_przeznaczenie);
  15.  


Czy mogę coś jeszcze zrobić, żeby zeskalowane zdjęcie było lepszej jakości? Obecnie różnica pomiędzy zdjęciem zeskalowanym tą funkcją a zdjęciem zeskalowaneym w photoshopie jest ogromna na korzyśc photoshopa.. Szczególnie gdy zmniejszam zdjęcie do małych wymiarów np 100px X 100px przy wymiarach 200px X 200px jużjest znacząco lepiej.
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.