Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: getimagesize() i avatary
Forum PHP.pl > Forum > PHP
MatheW
Udostępniam uzytkownikom możliwość avatarów - można wysłać na serwer lub wpisać adres obrazka z sieci. I z tą drugą metodą mam problem. Podczas zapisania adresu obrazka robie getimagesize() i sprawdzam jego rozmiary. Jednak jest możliwość, ze w przyszłości uzytkownik zmieni ten obrazek na jakiś duży (tj. uploaduje na jego miejsce duży obrazek o tej samej nazwie, a więc dalej do niego się odnosi wpis w bazie). Chciałem więc przy każdym wyświetleniu ava sprawdzić rozmiary tego obrazka, i gdy jest on za duży to go po prostu nie wyświetlić. Jednak skrypt strasznie zwalnia - przy jednym obrazku wykonuje sie 3,4 sekundy!

Czy ma ktoś pomysł jak inaczej rozwikłać ten problem? Czy to normalne, że ta funkcja tak obciąża serwer? Jakie wy stosujecie sposoby na avatary?
Ludvik
Takie rozwiązanie nie ma sensu. Po pierwsze pobierasz ten obrazek do skryptu php. Odwiedzający musi go ponownie pobrać. Kilkusekundowe opóźnienie, to czas żądania pobrania obrazka, a nie funkcji getimagesize.

Najlepiej pobrać ten obrazek na serwer i zapisać. To rozwiązanie eliminuje dynamiczne awatary - takie jak ma np. kszychu. Myślę, że rozsądnie by było kazać podać (albo jednorazowo pobrać) rozmiar obrazka przy podawaniu adresu i narzucić go w kodzie html/css.

Nie wiem jak to działa na tym forum...
MatheW
Właśnie tak sie zastanawiałem jak to działa na forach.. Czy może ktoś posiada taką wiedzę, lub sam wykonywał podobny system avatarów?
thornag
Nie latwiej ten obrazek zeskalowac ?

  1. <?php
  2.  
  3. $filename = $_REQUEST['image'];
  4. $max_width = $_REQUEST['max_width'];
  5. $max_height = $_REQUEST['max_height'];
  6. if (!$max_width)
  7. $max_width = 150;
  8. if (!$max_height)
  9. $max_height = 150;
  10. $size = GetImageSize($filename);
  11. $width = $size[0];
  12. $height = $size[1];
  13.  
  14.  
  15. header('Content-type: '.$size['mime']);
  16.  
  17.  
  18.  
  19.  
  20. $x_ratio = $max_width / $width;
  21. $y_ratio = $max_height / $height;
  22.  
  23. if ( ($width <= $max_width) && ($height <= $max_height) ) {
  24. $newwidth = $width;
  25. $newheight = $height;
  26. }
  27. elseif (($x_ratio * $height) < $max_height) {
  28. $newheight = ceil($x_ratio * $height);
  29. $newwidth = $max_width;
  30. }
  31. else {
  32. $newwidth = ceil($y_ratio * $width);
  33. $newheight = $max_height;
  34. }
  35.  
  36.  
  37. $thumb = imagecreatetruecolor($newwidth, $newheight);
  38. switch($size['mime']) {
  39. case "image/gif":
  40. $source = imagecreatefromgif($filename);
  41. imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
  42. imagegif($thumb);
  43. break;
  44.  
  45.  
  46. case "image/jpg":
  47. case "image/pjpeg":
  48. case "image/jpeg":
  49.  
  50. $source = imagecreatefromjpeg($filename);
  51. imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
  52. imagejpeg($thumb);
  53. break;
  54. case "image/pjpeg":
  55. $source = imagecreatefromjpeg($filename);
  56. imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
  57. imagejpeg($thumb);
  58. break;
  59. case "image/png":
  60. $source = imagecreatefrompng($filename);
  61. imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
  62. imagejpng($thumb);
  63. break;
  64.  
  65. }
  66.  
  67.  
  68.  
  69. ?>


Wywolanie

  1. <img src="image.php?image=urlencode(sciezka do obrazka)&max_height=ilechcesz&max_width=ilechcesz">


Gdzie image.php to ten plik powyzej.
legorek
Thornag, miodny sposób, żeby zajechac serwer.

Tak jak już ktoś wspomniał, lepiej ściągac obrazki do siebie.
Coyote
tia wedlug mnie tez lepiej pobrac obrazek do siebie na serv ... mniejsze obciazenie serva i wogole ... i nie bedzie myku z "podmienionym avatarem o tej samej nazwie" snitch.gif


Pozdrawiam Coyote
thornag
Ja w ten sposob wyswietlam za kazdym razem. Nie ma ich za wiele, pozatym serwer mam dedykowany tongue.gif

A obrazek po zresizowaniu zawsze mozna zapisac na serwer a stary usunac.
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.