Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Skalowanie grafiki, jak osiągnąć najlepszą jakość?
Abaddor
post 26.11.2009, 21:29:14
Post #1





Grupa: Zarejestrowani
Postów: 65
Pomógł: 9
Dołączył: 30.06.2009

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


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.

Ten post edytował Abaddor 26.11.2009, 21:29:39
Go to the top of the page
+Quote Post
thek
post 26.11.2009, 21:54:18
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Crozin
post 26.11.2009, 21:55:03
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
Abaddor
post 26.11.2009, 22:29:13
Post #4





Grupa: Zarejestrowani
Postów: 65
Pomógł: 9
Dołączył: 30.06.2009

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


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
Go to the top of the page
+Quote Post
thek
post 26.11.2009, 22:33:18
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Riklaunim
post 27.11.2009, 00:26:18
Post #6





Grupa: Zarejestrowani
Postów: 640
Pomógł: 44
Dołączył: 8.02.2004

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


Stworzyć zwykłą miniaturę i ją wyostrzyć smile.gif


--------------------
Biblioteki: Skrypty, CMS | Kurs PHP | Python
Go to the top of the page
+Quote Post
b4x
post 27.11.2009, 00:40:28
Post #7





Grupa: Zarejestrowani
Postów: 658
Pomógł: 95
Dołączył: 20.12.2005
Skąd: N54,35° E18,63° (Gdańsk)

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


ImageMagick ?


--------------------
Go to the top of the page
+Quote Post
Abaddor
post 28.11.2009, 17:32:43
Post #8





Grupa: Zarejestrowani
Postów: 65
Pomógł: 9
Dołączył: 30.06.2009

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


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.
Go to the top of the page
+Quote Post
thek
post 28.11.2009, 23:20:25
Post #9





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 11:10