Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Skalowanie zdjęć
Forum PHP.pl > Forum > Przedszkole
-Bartek-
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.
JoShiMa
Zainteresuj się funkcją GetImageSize
Zwróci Ci wymiary zdjęcia, które możesz sobie przeskalować
neverever
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. ?>
JoShiMa
O matko... przeciez to sie robi w 5-6 linijkach.
neverever
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.
JoShiMa
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.
-Bartek-
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.
JoShiMa
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. ?>
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.