Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: skalowanie obrazka
Forum PHP.pl > Forum > PHP
ktuvok
Głowię się nad funkcją, która skalowałaby zdjęcie do miniaturki o zadanych maksymalnych rozmiarach i nie mogę wymyśleć - czy ktoś słyszał może o gotowej funkcji?

Przejrzałem forum, ale trafiłem tylko na funkcję służącą do trwałej zmiany obrazka, zapisującą go w osobnym pliku. Ja chciałbym zdjęcie o normalnych rozmiarach, zapisane na serwerze, wyświetlać jako miniaturkę.

Pozdrawiam,
K
aleksander
a po co Ci do tego funkcja? w ustawiasz sobie atrybuty width i height tagi <img /> obrazka i juz:)
ktuvok
Przecież wtedy mi się rozciągnie albo spłaszczy!
Liko
  1. <?php
  2. function forceConstraints($srcFile, $srcType, $dstType, $dstWidth, $dstHeight, $dstPath)
  3. {
  4.  if ($srcType == "jpg")
  5.  $handle = @imagecreatefromjpeg($srcFile);
  6.  else if ($srcType == "png")
  7.  $handle = @imagecreatefrompng($srcFile);
  8.  else if ($srcType == "gif")
  9.  $handle = @imagecreatefromgif($srcFile);
  10.  else
  11.  return false;
  12.  
  13.  if (!$handle) return false;
  14.  
  15.  $srcWidth = @imagesx($handle);
  16.  $srcHeight = @imagesy($handle);
  17.  
  18.  $newHandle = @imagecreatetruecolor($dstWidth, $dstHeight);
  19.  if (!$newHandle)
  20.  return false;
  21.  
  22.  if($srcHeight < $srcWidth)
  23.  {
  24.  $ratio = (double)($srcHeight / $dstHeight);
  25.  
  26.  $cpyWidth = round($dstWidth * $ratio);
  27.  if ($cpyWidth > $srcWidth)
  28.  {
  29.  $ratio = (double)($srcWidth / $dstWidth);
  30.  $cpyWidth = $srcWidth;
  31.  $cpyHeight = round($dstHeight * $ratio);
  32.  $xOffset = 0;
  33.  $yOffset = round(($srcHeight - $cpyHeight) / 2);
  34.  } else {
  35.  $cpyHeight = $srcHeight;
  36.  $xOffset = round(($srcWidth - $cpyWidth) / 2);
  37.  $yOffset = 0;
  38.  }
  39.  
  40.  } else {
  41.  $ratio = (double)($srcWidth / $dstWidth);
  42.  
  43.  $cpyHeight = round($dstHeight * $ratio);
  44.  if ($cpyHeight > $srcHeight)
  45.  {
  46.  $ratio = (double)($srcHeight / $dstHeight);
  47.  $cpyHeight = $srcHeight;
  48.  $cpyWidth = round($dstWidth * $ratio);
  49.  $xOffset = round(($srcWidth - $cpyWidth) / 2);
  50.  $yOffset = 0;
  51.  } else {
  52.  $cpyWidth = $srcWidth;
  53.  $xOffset = 0;
  54.  $yOffset = round(($srcHeight - $cpyHeight) / 2);
  55.  }
  56.  }
  57.  
  58.  if (!@imagecopyresampled($newHandle, $handle, 0, 0, $xOffset, $yOffset, $dstWidth, $dstHeight, $cpyWidth, $cpyHeight))
  59.  return false;
  60.  @imagedestroy($handle);
  61.  
  62.  if ($dstType == "png")
  63.  @imagepng($newHandle, $dstPath.".png");
  64.  else if ($dstType == "jpg")
  65.  @imagejpeg($newHandle, $dstPath.".jpg", 100);
  66.  else if ($dstType == "gif")
  67.  @imagegif($newHandle, $dstPath.".gif");
  68.  else
  69.  return false;
  70.  @imagedestroy($newHandle);
  71.  return true;
  72. }
  73. ?>


Funkcja wyciągnieta prosto z komenatrzy w manualu exclamation.gif! Przeglądaj je czasami.
LuckyStrike
Cześć! Dorzucę swoje 3 grosze winksmiley.jpg Nie jest to bardzo eleganckie rozwiązanie, ale bardzo proste i skuteczne. Opiera się na skalowaniu obrazka do zadanej szerokości lub wysokości tak, aby właśnie nie spłaszczyć/rozciągnąć go.
Pętla pomniejsza obrazek za każdym razem o 1% aż do zadanej wys/szer.
Pozdrawiam!


  1. <?
  2. if ( ! fopen ("zdjecia/sprzet/$img")){
  3. error_log("$czas Nie mogę otworzyc pliku: zdjecia/sprzet/$img",3,"logi/bledy.log");}
  4. $dane = getimagesize("zdjecia/sprzet/$img");
  5. $szer1=$dane[0];
  6. $wys1=$dane[1];
  7. $zmiana2=($dane[0]*1/100);
  8. $zmiana3=($dane[1]*1/100);
  9.  
  10. while ($wys1 > 600){
  11. $wys1 = ($wys1-$zmiana3);
  12. $szer1 = ($szer1-$zmiana2);
  13. }
  14.  
  15. //echo "szer po zmianie. $szer<br>";
  16. //echo "wys po zmianie. $wys<br>";
  17.  
  18. <html>
  19. <body>
  20. <img SRC="zdjecia/sprzet/$img" width=$szer1 height=$wys1 border=0 >
  21. </BODY>
  22. </HTML>");
  23. ?>
Pigula
szukales nie dokladnie tongue.gif tiraeth zamiescil swoja wersje tutaj dalej sa pomysly na modyfikacje jej
LuckyStrike
Ja właściwie nie szukałem wcale. Po prostu natknąłem sie na taki wątek i wrzuciłem swój skrypcik, który jest bardzo krótki, prosty do zrozumienia i co najważniejsze działa...
Pewnie nie mam racji, ale raczej jestem za prostymi rozwiązaniami (porównaj ilość kodu) które będą zrozumiałe dla początkujących.
Pozdrawiam!
ActivePlayer
ale Twój skrypt marnuje troszke 'przesył transferu' bo obrazek pomimo tego ze jest duzy, wyswietla sie w malych rozmiarach
Pigula
Cytat(LuckyStrike @ 2005-08-18 16:12:22)
Pewnie nie mam racji, ale raczej jestem za prostymi rozwiązaniami (porównaj ilość kodu) które będą zrozumiałe dla początkujących.

nie masz racji smile.gif ilosc linijek kodu nie moze byc glownym kryteriu oceniania wydajnosci programu
Pozdrawaim
LuckyStrike
Cytat
ale Twój skrypt marnuje troszke 'przesył transferu' bo obrazek pomimo tego ze jest duzy, wyswietla sie w malych rozmiarach


To jest dla mnie argument. Zgadzam się w 100%.

Cytat
nie masz racji  ilosc linijek kodu nie moze byc glownym kryteriu oceniania wydajnosci programu

Wcale nie twierdzę że ilość linijek ma wpływ na wydajność programu!
Często jest dokładnie na odwrót - czego przykładem jest własnie mój skrypt, co słusznie zauważył ActivePlayer.
Chodziło mi po prostu o znalezienie rozwiązania, które tak naprawdę samo nasuwa się na mysl i jest zrozumiałe dla kogoś początkujacego. Moim zdaniem w ten sposób mozna nauczyc się wykożystywania już posiadanej wiedzy z php zamiast kopiować bardzo dobrego gotowca, którego zrozumienie może być dla niektórych za trudne...
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.