Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skalowanie grafiki, jak osiągnąć najlepszą jakość?
Forum PHP.pl > Forum > PHP
Abaddor
Wbudowane w PHP skalowanie jest kompletnie do niczego. Przy jakości 100 i tak obrazek po zmniejszeniu zostaje zmasakrowany.
Więc mam pytania.

1. Czy są jakieś inne biblioteki którymi osiągnę lepszą jakość przy zmniejszaniu?
2. Czy używając jakiś bibliotek Javy Scriptu osiągnę lepszą jakość po skalowaniu?
3. Czy istnienie możliwość takiego działania:
a) pobieram obrazek formularzem na serwer
B) przy wyświetlaniu skaluje go przez JS
c) zapisuję ze skalowany obrazek na serwerze
Jeśli tak to jak to zrobić? Wszystko ma być automatycznie.

Problem mam ponieważ po wrzuceniu grafiki na serwer(max 1200x1200) jest ona skalowana do szerokości 600, lecz z zachowaniem ratio.
Robi się straszna pixelizacja. A jeszcze trzeba obrazek wykadrować, wtedy już jest masakra.

Proszę o pomoc.
thek
ad 1) Biblioteki dające super efekty zapewne są, ale nie sądzę, byś mógł przez php na jakimkolwiek hostingu ich używać winksmiley.jpg
ad 2) Nie sądzę. Skalowanie zawsze wiąże się z utratą jakości i nic na to nie poradzisz.
ad 3) A rozróżniasz gdzie się wykonuje kod php a gdzie kod js? Czy jeśli chcesz zmniejszyć obrazek to wysyłasz go do kumpla pocztą na drugim końcu Polski czy robisz to sam?

To, że masz porąbaną jakość może wynikać ze złego doboru funkcji. Spróbuj zamiast imagecopyresized -> imagecopyresampled. Poza tym weź pod uwagę, że obrazy dobrze się skalują tylko na skalach będących wielokrotnością 2, każda inna zawsze zniekształci obraz o wiele bardziej, ponieważ jest obliczana wypadkowa ze znacznej ilości punktów. To prosta matma.
Crozin
1) Pewnie korzystasz z biblioteki GD. Możesz jeszcze spróbować użyć ImageMagic - chociaż mógłbyś pokazać skrypt i jego rezultaty? GD całkiem dobrze z tego co pamiętam radzi sobie ze sklaowaniem.
2) Przeglądarki potrafią ładnie skalować grafiki, ale musiałbyś przesyłać im cały plik (który przecież waży pewnie kilka mega) - poza tym nie tędy droga.
Abaddor
ad 3) A rozróżniasz gdzie się wykonuje kod php a gdzie kod js? Czy jeśli chcesz zmniejszyć obrazek to wysyłasz go do kumpla pocztą na drugim końcu Polski czy robisz to sam?

to wiem, dla tego spytałem czy da się tak pomieszać php z JC, ale tak jak myślałem, czyli się nie da.

Mam 2 funkcje skalujące. Ta działa automatycznie przy zapisywaniu grafiki na server.
  1. public function Skaluj_Do($obrazek)
  2. {
  3. $img = imagecreatefromjpeg($obrazek);
  4.  
  5.  
  6.  
  7.  
  8. $width= imagesx($img);
  9. $height= imagesy($img);
  10.  
  11. if($width > 600)
  12. {
  13. $roznica=$width - 600;
  14.  
  15. $procent=($roznica * 100)/$width;
  16.  
  17. $procent=ceil($procent);
  18.  
  19. $procent=$procent * 0.01;
  20. $procent=1.0 - $procent;
  21.  
  22. }
  23. else
  24. {
  25. return 0;
  26. }
  27. $width= $width * $procent;
  28. $height= $height * $procent;
  29.  
  30. $mini = imagecreatetruecolor($width,$height);
  31. imagecopyresized($mini, $img, 0, 0, 0, 0, $width, $height, imagesx($img), imagesy($img));
  32.  
  33. imagejpeg($mini, $obrazek, 100);
  34.  
  35. }
  36.  


Działa tak aby szerokość wyskalować na 600, i wysokość dać taką aby ratio było zachowane.
Krótko siedzę w php więc nie wypominajcie mi proszę kodu:P
thek
To zmień imagecopyresized na imagecopyresambled poza tym zapis na 100 jest bezsensowny. Tworzysz ogromne pliki, które niemal niczym nie różnią się od tych z 75 a są często kilkukrotnie większe smile.gif Ludzkie oko przy wymiarach 600px nie dostrzega różnicy podobnie jak pomiędzy plikiem wave a mp3 z wysokim bitrate smile.gif A skoro nie widać to po co zasyfiać serwer winksmiley.jpg
Riklaunim
Stworzyć zwykłą miniaturę i ją wyostrzyć smile.gif
b4x
ImageMagick ?
Abaddor
Cytat(thek @ 26.11.2009, 22:33:18 ) *
To zmień imagecopyresized na imagecopyresambled...



Wielkie dzięki! Pomogło i obrazki wyglądają nieporównywalnie lepiej. Nigdy bym nie wpadł żeby skalować funkcją do kadrowania, hehe.
Wielki szacunek i jeszcze raz dzięki za pomoc.
thek
Imagecopyresampled służy nie tylko do kadrowania przecież smile.gif Ma dokładnie te same parametry co imagecopyresized, ale dodatkowo dane obrazu są próbkowane w celu uzyskania lepszej jakości wyjściowej. Większość osób to właśnie tej funkcji używa do skalowania a nie używanej przez Ciebie do tej pory.
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.