Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Pytanie] Funkcja graficza, Szukam funcji do zmiany rozmieru
Linandar
post
Post #1





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 30.12.2004
Skąd: Mielec

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


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?

Ten post edytował Linandar 11.01.2005, 18:35:58
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
sendi16
post
Post #2





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 29.03.2003
Skąd: Kraków

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


a po co ci petla??

nie latwiej obliczyc stosunek np oryginalnej szerokosci obrazka i zmniejszonej, a pozniej w tym samym stosunku zmniejszyc wysokosc??
Go to the top of the page
+Quote Post
tiraeth
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

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


  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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Obrazek zawsze będzie o rozmiarach $max_x na $max_y ale zmniejszony jpeg będzie wycentrowany (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Ten post edytował Tiraeth 11.01.2005, 19:53:29
Go to the top of the page
+Quote Post
Linandar
post
Post #4





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 30.12.2004
Skąd: Mielec

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


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ą.
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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.
Go to the top of the page
+Quote Post
bela
post
Post #6


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


Cytat(dr_bonzo @ 2005-01-11 21:35:52)
wiec czeka cie petelka.

rekurencja dokladniej (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Linandar
post
Post #7





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 30.12.2004
Skąd: Mielec

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


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.

Ten post edytował Linandar 13.01.2005, 14:07:06
Go to the top of the page
+Quote Post
ikioloak
post
Post #8





Grupa: Zarejestrowani
Postów: 416
Pomógł: 0
Dołączył: 8.01.2004

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


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:)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 20:44