Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Pytanie] Funkcja graficza
Forum PHP.pl > Forum > PHP
Linandar
Mam pytanie, czy istnieje jakaś gotowa funcja [jakaśfukcja(źródło_do_zmiany, rozmiar_do_jakiego_ma_być_zmieniony)] która zmniejszyłaby obrazek do danego rozmiaru z zachowaniem proporcji wymiarów czy należy to zrobić w pętelce - zmniejszać wymiary aż rozmiar będzie odpowiedni?
sendi16
a po co ci petla??

nie latwiej obliczyc stosunek np oryginalnej szerokosci obrazka i zmniejszonej, a pozniej w tym samym stosunku zmniejszyc wysokosc??
tiraeth
  1. <?php
  2. function resizeImage($source, $max_x, $max_y, $save_image, $jpeg_quality)
  3. {
  4.  /*
  5. * source - obrazek jpeg
  6. * max_x - maksymalna szerokosc pomniejszonego obrazka
  7. * max_y - maksymalna dlugosc pomniejszonego obrazka
  8. * save_image - nazwa pliku do ktorego zostanie zapisany nowy obrazek
  9. * jpeg_quality - jakosc powstalego obrazu jpeg
  10. */
  11.  
  12.  $img_src = imagecreatefromjpeg($source);
  13.  
  14.  $image_x = imagesx($img_src);
  15.  $image_y = imagesy($img_src);
  16.  if($image_x > $image_y) // Landscape
  17.  {
  18. $ratio_x = ($image_x > $max_x) ? $max_x/$image_x : 1;
  19. $ratio_y = $ratio_x;
  20. $move = 'y';
  21.  }
  22.  else // Portrait
  23.  {
  24. $ratio_y = ($image_y > $max_y) ? $max_y/$image_y : 1;
  25. $ratio_x = $ratio_y;
  26. $move = 'x';
  27.  }
  28. $new_x = $image_x*$ratio_x;
  29. $new_y = $image_y*$ratio_y;
  30.  
  31. $move_x = ($move == &#092;"x\") ? ($max_x-$new_x)/2 : 0;
  32. $move_y = ($move == &#092;"y\") ? ($max_y-$new_y)/2 : 0;
  33.  
  34. $new_img = imagecreatetruecolor($max_x, $max_y);
  35. $background = imagecolorallocate($new_img, 255, 255, 255);
  36. imagefill($new_img, 0, 0, $background);
  37. imagecopyresampled($new_img, $img_src, $move_x, $move_y, 0, 0, $new_x, $new_y, $image_x, $image_y);
  38.  
  39. imagejpeg($new_img, $save_image, 100);
  40.  
  41.  echo '<img src=\"'.$save_image.'\" border=\"1\">';
  42. }
  43.  
  44. // Przykład zastosowania
  45. resizeImage('obrazek1.jpg', 75, 75, 'obrazek2.jpg', 100);
  46. ?>


edit: Skrypt przetestowany i lekko zmodyfikowany smile.gif Obrazek zawsze będzie o rozmiarach $max_x na $max_y ale zmniejszony jpeg będzie wycentrowany biggrin.gif
Linandar
To co napisaliście znam, ale dziękuję.
Chodziło mi o to, aby z obrazka 400kB zrobić 50kB. Wymiary były dla mnie sprawą drugorzędną.
dr_bonzo
W JPEGach objetosc pliku jest zalezna od zawartosci tego obrazu: dla dwoch obrazow tych samych wymiarow caly czerwony obraz bedzie zajmowal mniej miejsca od np. krajobrazu. Tzn wielkoscobrazu bedzie znana dopiero po jego zmniejszeniu wiec czeka cie petelka.
bela
Cytat(dr_bonzo @ 2005-01-11 21:35:52)
wiec czeka cie petelka.

rekurencja dokladniej smile.gif
Linandar
Tak właśnie myślałem... Jak pisałem w pierwszym poście, miałem cichą nadzieję, że istnieje jakaś funkcja, która to załatwi za mnie.
Dziekują wszystkim za podpowiedzi.
Oto co napisałem:
  1. <?php
  2.  
  3. $img_type = null;
  4.  
  5. function getImage($imgName)
  6. {
  7.       $ext = pathinfo($imgName);
  8.       $ext = strtolower($ext['extension']);
  9.       if($ext == 'jpg' || $ext == 'jpeg')
  10.       {
  11.             $img = imagecreatefromjpeg($imgName);
  12.             $GLOBALS['img_type'] = IMG_JPEG;
  13.       }
  14.       else if($ext == 'gif')
  15.       {
  16.             $img = imagecreatefromgif($imgName);
  17.             $GLOBALS['img_type'] = IMG_GIF;
  18.       }
  19.       else if($ext == 'png')
  20.       {
  21.             $img = imagecreatefrompng($imgName);
  22.             $GLOBALS['img_type'] = IMG_PNG;
  23.       }
  24.       else
  25.       {
  26.             $img = null;
  27.             $GLOBALS['img_type'] = null;
  28.       }
  29.       return $img;
  30. }
  31.  
  32. function saveImage($img, $name, $imgType)
  33. {
  34.       switch($imgType)
  35.       {
  36.             case IMG_JPEG:
  37.                   imagejpeg($img, $name);
  38.                   break;
  39.             case IMG_GIF:
  40.                   imagegif($img, $name);
  41.                   break;
  42.             case IMG_PNG:
  43.                   imagepng($img, $name);
  44.                   break;
  45.       }
  46.       return $weight;
  47. }
  48.  
  49. function resize($imgName, $size)
  50. {
  51.       if(!($img = getImage($imgName)))
  52.       {
  53.             echo(&#092;"Nie mogę otworzyć pliku: $imgName\");
  54.             return false;
  55.       }
  56.  
  57.       $img_w = imagesx($img);
  58.       $img_h = imagesy($img);
  59.  
  60.       $ratio = $img_w / $img_h;
  61.  
  62.       if($ratio > 1)
  63.       {
  64.             $new_img_w = $size;
  65.             $new_img_h = ($size / $ratio);
  66.       }
  67.       else
  68.       {
  69.             $new_img_w = ($size * $ratio);
  70.             $new_img_h = $size;
  71.       }
  72.  
  73.       $tempImg = imagecreatetruecolor($new_img_w, $new_img_h);
  74.       imagecopyresized($tempImg, $img, 0, 0, 0, 0, $new_img_w, $new_img_h, $img_w, $img_h);
  75.  
  76.       saveImage($tempImg, $imgName, $GLOBALS['img_type']);
  77. }
  78. /*******************************************************************/
  79. //               do celów testowych wstawiłem dane:   
  80. $fileupload_name =  'img.jpg';//- nazwa pliku załadowanego na serwer
  81.  
  82. $weight = filesize($fileupload_name);// - początkowy rozmiar pliku
  83.  
  84. $file_size_ind = 102400;// - makszymalny rozmiar pliku w B (bytes)
  85. /*******************************************************************/
  86.  
  87. $img = getImage($fileupload_name);
  88. $img_x = imagesx($img);
  89. $img_y = imagesy($img);
  90. $size = ($img_x > $img_y) ? $img_x : $img_y;
  91. $i=0;
  92. While ($weight > $file_size_ind)
  93. {
  94.       $i++;
  95.       $img = getImage($fileupload_name);
  96.       $img_x = imagesx($img);
  97.       $img_y = imagesy($img);
  98.       $size = round((($img_x > $img_y) ? $img_x : $img_y) * 0.9, 0);
  99.       resize($fileupload_name, $size);
  100.       $weight = clearstatcache(filesize($fileupload_name));
  101.       $weight = filesize($fileupload_name);
  102. }
  103.  
  104. echo (&#092;"Ilość pętli: \" . $i . \"<br>\");
  105. echo ('<center><IMG SRC=\"' . $fileupload_name . '\"><br>');
  106. echo ('Plik ma rozmiar: ' . filesize($fileupload_name) . ' B<br>');
  107. $img = getImage($fileupload_name);
  108. echo ('i wymiary: ' . imagesx($img) . 'x' . imagesy($img) . '</center>');
  109. ?>

Działa prwaidłowo ale jeśli ktoś miałby ochotę polepszyć go to proszę o komentarz.
ikioloak
Kod Tiraetha jak dla mnei jest bardzo dobry tylko ze przez nieuwage [chyba:)] zrobil w linii 40 maly blad:
  1. <?php
  2.  
  3. imagejpeg($new_img, $save_image, 100);
  4.  
  5. ?>


Powinno byc:
  1. <?php
  2.  
  3. imagejpeg($new_img, $save_image,$jpeg_quality);
  4.  
  5. ?>


Teraz juz miniatury beda zajmowac mniej wiecej tyle ile chcesz:)
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.