Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Skalowanie zdjęć
--Bartek--
post 22.07.2008, 13:18:28
Post #1





Goście







Witam, jestem w trakcie robienia forum, i mam taki problem. Gdy użytkownicy dodają swoje zdjęcia jako avatar problemem jest skalowanie zdjęć. Nie chciał bym narzucać użytkownikom określonego rozmiaru zdjęć które muszą wgrać. Natomiast ja jako administrator jeżeli ustalam stały rozmiar zdjęcia np 80px * 80 px, niektóre zdjęcie przyjmują brzydki wygląd. Jak sobie poradzić z takim problemem, aby w określonych wartościach np. w przedziale od (60px do 100 px) * (60px do 100 px) zdjęcie zostało ładnie proporcjonalnie zeskalowane. Wdzięczny bym był za jakieś propozycje, linki, dużo szukałem ale nie znalazłem nic sensownego.
Powód edycji: dodałem tag (cysiaczek)
Go to the top of the page
+Quote Post
JoShiMa
post 22.07.2008, 13:25:52
Post #2





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


Zainteresuj się funkcją GetImageSize
Zwróci Ci wymiary zdjęcia, które możesz sobie przeskalować


--------------------
Go to the top of the page
+Quote Post
neverever
post 22.07.2008, 14:31:53
Post #3





Grupa: Zarejestrowani
Postów: 278
Pomógł: 44
Dołączył: 17.02.2004
Skąd: Wieliczka

Ostrzeżenie: (10%)
X----


Co do skalowania, to przetestuj sobie ten kod:
  1. <?php
  2. function colordecode($hex){
  3. $code[r] = hexdec(substr($hex, 0 ,2));
  4. $code[g] = hexdec(substr($hex, 2 ,2));
  5. $code[b] = hexdec(substr($hex, 4 ,2));
  6. return $code;
  7. }
  8.  
  9.  
  10.  
  11. function scale($srcImage,$jpgCompression='90',$newX,$newY,$bgColor='FFFFFF'){
  12.  
  13. $ext = strtolower(substr ($srcImage, strrpos ($srcImage, '.')));
  14.  
  15. switch($ext)
  16.  {
  17. case '.gif':
  18.  $orgImage = imagecreatefromgif($srcImage);
  19.  break;
  20.  
  21. case '.jpg':
  22.  $orgImage = imagecreatefromjpeg($srcImage);
  23.  break;
  24.  
  25. case '.png':
  26.  $orgImage = imagecreatefrompng($srcImage);
  27.  break;
  28.  }
  29.  
  30.  
  31.  
  32. //$orgImage = imagecreatefromjpeg($srcImage);
  33.  
  34. $orgW  = imagesx($orgImage);
  35. $orgH  = imagesy($orgImage);
  36.  
  37. /* $backgroundimage = imagecreatetruecolor($newX,$newY);
  38. $code = colordecode($bgColor);
  39. $backgroundcolor = ImageColorAllocate($backgroundimage, $code[r], $code[g], $code[b]);
  40. ImageFilledRectangle($backgroundimage, 0, 0, $newX, $newY, $backgroundcolor);
  41. $x = imagesx($orgImage);
  42. $y = imagesy($orgImage);
  43. ImageAlphaBlending($backgroundimage, true);
  44.  
  45. */
  46.  
  47. $x=$orgW;
  48. $y=$orgH;
  49. $mlt=$newX/$x;
  50. $nx=ceil($x * $mlt);
  51. $ny=ceil($y * $mlt);
  52. if ($ny>$newY){
  53. $mlt=$newY/$ny;
  54. $nx=ceil($nx * $mlt);
  55. $ny=ceil($ny * $mlt);
  56.  
  57. }
  58.  
  59. $dst_img = imagecreatetruecolor($nx,$ny);
  60. imagecopyresampled($dst_img,$orgImage,0,0,0,0,$nx+1,$ny+1,$orgW,$orgH);
  61. $orgImage = $dst_img;
  62.  
  63. /*
  64.  
  65. $x = imagesx($orgImage)+1;
  66. $y = imagesy($orgImage)+1;
  67. $sX = ceil(($newX-$x)/2);
  68. $sY =ceil(($newY-$y)/2);
  69. imagecopy($backgroundimage, $orgImage, $sX, $sY, 0, 0, $newX+4, $newY+4);
  70. ImageFilledRectangle($backgroundimage, ($newX-$sX-1), 0, $newX, $newY, $backgroundcolor);
  71.  
  72.  ImageFilledRectangle($backgroundimage, 0, ($newY-$sY-1), $newX, $newY, $backgroundcolor);
  73. $orgImage = $backgroundimage;
  74.  
  75. */
  76.  
  77. return $orgImage;
  78.  
  79. }
  80. ?>


--------------------
neverever
Go to the top of the page
+Quote Post
JoShiMa
post 22.07.2008, 14:53:15
Post #4





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


O matko... przeciez to sie robi w 5-6 linijkach.


--------------------
Go to the top of the page
+Quote Post
neverever
post 22.07.2008, 16:17:29
Post #5





Grupa: Zarejestrowani
Postów: 278
Pomógł: 44
Dołączył: 17.02.2004
Skąd: Wieliczka

Ostrzeżenie: (10%)
X----


Cytat(JoShiMa @ 22.07.2008, 15:53:15 ) *
O matko... przeciez to sie robi w 5-6 linijkach.
Nie opowiadaj że w 5-6 linijkach zmieścisz rozpoznawanie rozszerzenia i skalowanie z zachowaniem proporcji. Tu w dodatku na 2sposoby (jeden został wykomentowany). W sumie to można i w jednej linijce długiej wszystko napisać ;P
Prawda, że mozna by to pewnie trochę jeszcze uprościć ale mi się już nie chciało i nie maiałem takiej potrzeby.


--------------------
neverever
Go to the top of the page
+Quote Post
JoShiMa
post 22.07.2008, 21:16:39
Post #6





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


Cytat(neverever @ 22.07.2008, 17:17:29 ) *
Nie opowiadaj że w 5-6 linijkach zmieścisz rozpoznawanie rozszerzenia

A po co rozpoznawanie rozszeżenia?

Skalowanie z zachowaniem proporcji, proszę bardzo:

  1. <?php
  2. function miniatura($foto, $max){
  3. $rozmiar = GetImageSize($foto);
  4. if($rozmiar[0]>$rozmiar[1]) $wspolczynnik = $rozmiar[0]/$max;
  5. else $wspolczynnik = $rozmiar[1]/$max;
  6.  
  7. $szerokosc = (int)($rozmiar[0]/$wspolczynnik);
  8. $wysokosc = (int)($rozmiar[1]/$wspolczynnik);
  9. $class = ' style="width:'.$szerokosc.'px; height:'.$wysokosc.'px;"';
  10. return '<img src="'.$foto'"alt="miniatura" '.$class.' />';
  11. }
  12. ?>


Pomyliłam. Się 7 linijek.

Ten post edytował JoShiMa 22.07.2008, 21:17:54


--------------------
Go to the top of the page
+Quote Post
--Bartek--
post 23.07.2008, 00:12:28
Post #7





Goście







Ok wielkie dzięki za pomoc. Już stworzyłem własną wersję skryptu, szkoda tylko że nie można zmienić rozmiaru zdjęcia ( w rzeczywistości tj. użyć skalowania aby później ten plik został zapisany w takim rozmiarze na dysku). A teraz mam pytanie odnośnie optymalizacji. Bo to jest tak, za każdym razem gdy gdzieś będzie jakaś fotka , będzie musiała przelecieć przez skrypcik aby uzyskać odpowiedni rozmiar, ja planuję zrobić tak że informacja będzie zapisywana do bazy danych, i nie będę musiał przy każdej fotce uruchamiać tego skryptu, a tylko przy wgrywaniu.

1. Czy to ma sens? Bo nigdzie nie mogłem znaleźć co jest bardziej optymalne, czy im więcej w bazie tym lepiej, czy im więcej skrypty a mniej bazy to lepiej.

2. Dalej się łudzę że gdzieś jest sposób aby zapisać na serwerze przeskalowaną fotkę, bo wydaje mi się, że to byłoby najlepsze rozwiązanie.
Go to the top of the page
+Quote Post
JoShiMa
post 23.07.2008, 07:46:41
Post #8





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


Cytat(-Bartek- @ 23.07.2008, 01:12:28 ) *
Ok wielkie dzięki za pomoc. Już stworzyłem własną wersję skryptu, szkoda tylko że nie można zmienić rozmiaru zdjęcia ( w rzeczywistości tj. użyć skalowania aby później ten plik został zapisany w takim rozmiarze na dysku).

Oczywiście, że można:

  1. <?
  2. $katalog = opendir("./");
  3. while (false !== ($plik = readdir($katalog))) {
  4. if (!is_dir($plik) and eregi(".jpg",$plik)) $lista[]=$plik;
  5. }
  6. closedir($katalog);
  7.  
  8. $max = 120; // maksymalna długość boku dla miniatury w pionie lub poziomie
  9. foreach($lista as $fotka) {
  10. $f = imagecreatefromjpeg($fotka);
  11. $fx = imagesx($f);
  12. $fy = imagesy($f);
  13. $x = $y = 0;
  14. if ($fx>$max or $fy>$max) {
  15. if ($fx>$fy) $x = $max;
  16. else $y = $max;
  17. }
  18. if ($x>0 and $y<1) $y = ceil($fy*($x/$fx));
  19. else if ($y>0 and $x<1) $x = ceil($fx*($y/$fy));
  20. $mini = imagecreatetruecolor($x,$y);
  21. imagecopyresampled($mini,$f,0,0,0,0,$x,$y,$fx,$fy);
  22. imagejpeg($mini,"mini/$fotka",80);
  23. echo "$fotka - gotowe<br />";
  24. }
  25. ?>


--------------------
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.07.2025 - 23:55