Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmiana rozmiaru przesyłanego obrazku
Forum PHP.pl > Forum > PHP
Mephis
Witam.

Mam sobie taki oto kod:
  1. $uploaddir = "obrazki_profilowe"; //katalog uploadu
  2. $allowed_ext = "jpg, gif, png"; //mozliwe rozszerzenia
  3. $max_size = "20480"; //maksymalna waga
  4. $max_height = "140"; //maksymalna wysokosc
  5. $max_width = "140"; //maksymalna szerokosc
  6.  
  7. $extension = pathinfo($_FILES['file']['name']);
  8. $extension = $extension[extension];
  9. $allowed_paths = explode(", ", $allowed_ext);
  10.  
  11. for($i = 0; $i < count($allowed_paths); $i++) {
  12. if ($allowed_paths[$i] == "$extension")
  13. {
  14. $ok = "1";
  15. }
  16. }
  17.  
  18. //jezeli obraz za duzo wazy
  19. if ($ok == "1") {
  20. if($_FILES['file']['size'] > $max_size)
  21. {
  22. print "zbyt duza waga pliku";
  23. }
  24.  
  25. //jezeli obrazek ma nieprawidowe rozmiary
  26. if ($max_width && $max_height) {
  27. list($width, $height, $type, $w) = getimagesize($_FILES['file']['tmp_name']);
  28. if($width > $max_width || $height > $max_height)
  29. {
  30. print "nieprawidlowe rozmiary obrazu";
  31. }
  32. }
  33.  
  34. //upload
  35. if(is_uploaded_file($_FILES['file']['tmp_name']))
  36. {
  37. move_uploaded_file($_FILES['file']['tmp_name'],$uploaddir.'/'.$_FILES['file']['name']);
  38. }
  39. print "przeslano pomyslnie";
  40. } else {
  41. print "nie wybrano pliku";
  42. }


No i teraz tak. Potrzebuje przeróbki tego kodu tak, aby...
- uploadowany obrazek dopasowywał się do maksymalnej wysokości i szerokości podanej w danych (140x140px), niezależnie od rzeczywistego rozmiaru
- ten sam obrazek ma zrobić sobie jeszcze miniaturę zdjęcia o rozmiarach np. 50x50 i żeby został zapisany z jakimś dodatkiem do nazwy np. "PLIK-mini"

Uprzejmie proszę o pomoc.

Pozwolę sobie na zaktualizowanie wątku.

Póki co nie ma nawet co przerabiać kod, gdyż skrypt z niewiadomych powodów przestał działać...
Oryginalny skrypt: tutaj

Warunki sprawdzają się poprawnie, komunikaty pokazują się kiedy trzeba, ale gdy rzekomo dochodzi już do tego że obraz ma być przesłany na konto ftp, komunikat o poprawnym wysłaniu pliku na serwer się wyświetla się, ale obrazku brak na serwerze brak. Wcześniej działało. Chmody mam ustawione na 777 dla całego katalogu.

Aktualizuję wątek.

Co do powyższego błędu.. cóż, błędu żadnego nie było. Pliki które wysyłałem pojawiły się na FTP dopiero po dłuższym czasie. Ktoś mógłby przypuścić przyczynę?

Powracam do prośby: skalowanie obrazka do maksymalnych rozmiarow podanych w danych, oraz kopia obrazu (miniaturka) o jakiś mniejszych rozmiarach.
daniel1302
Może przyda ci się moja funkcja do skalowania obrazka(wystarczy delikatnie zmodyfikować)
  1. public function imageResize($path, $width, $height)
  2. {
  3. $extension = $this-> getExtension($path);
  4. list($oldWidth, $oldHeight) = getimagesize($path);
  5.  
  6. //Sprawdź czy szerokośc i wysokosc jest procentowa(przekazane mniejsze od 0)
  7. $width = ($width < 1) ? $oldWidth * $width : $width;
  8. $height = ($height < 1) ? $oldHeight * $height : $height;
  9.  
  10. $newImage = imagecreatetruecolor($width, $height);
  11. $tmpImage = $this -> imageHeaders[$extension]['f']($path);
  12. imagecopyresampled($newImage, $tmpImage, 0, 0, 0, 0, $width, $height, $oldWidth, $oldHeight);
  13.  
  14. //Zapisz obrazek
  15. $this -> imageHeaders[$extension]['fs']($newImage, $path);
  16. }


A cała klasa odpowiedzialna za obrazki:
  1. <?php
  2. /**
  3.  *Autor: daniel1302(daniel.1302@gmail.com)
  4.  *Zakaz usuwania tego komentarza
  5.  *Licencja: BSD License
  6.  */
  7. class Files
  8. {
  9. /**
  10. *Katalog na którym klasa pracuje
  11. */
  12. private $dir;
  13.  
  14. /**
  15. *Tablica z rozszerzeniami jakie klasa obsługuje
  16. */
  17. private $extensions = array(
  18. 'jpg',
  19. 'jpeg',
  20. 'gif',
  21. 'png',
  22. );
  23.  
  24. /**
  25. *Katalogi znajdujące się w aktualnym
  26. */
  27. private $dirs = array();
  28. /**
  29. *Tablica z headerami do obrazków
  30. */
  31. private $imageHeaders = array(
  32. 'jpeg' => array(
  33. 'h' => 'image/jpeg', //Kontent obrazka
  34. 'f' => 'imagecreatefromjpeg', //Funkcja otwierająca obrazek
  35. 'fs' => 'imagejpeg' //Funkcja zapisująca obrazek
  36. ),
  37. 'jpg' => array(
  38. 'h' => 'image/jpeg',
  39. 'f' => 'imagecreatefromjpeg',
  40. 'fs' => 'imagejpeg'
  41. ),
  42. 'gif' => array(
  43. 'h' => 'image/gif',
  44. 'f' => 'imagecreatefromgif',
  45. 'fs' => 'imagegif'
  46. ),
  47. 'png' => array(
  48. 'h' => 'image/png',
  49. 'f' => 'imagecreatefrompng',
  50. 'fs' => 'imagepng'
  51. ),
  52. );
  53.  
  54. public function __construct(array $extensions=null)
  55. {
  56. if (isset($extensions))
  57. $this -> extensions = $extensions;
  58. }
  59.  
  60. /**
  61. *Sprawdza czy można korzystać z takiego rozszezenia i zwraca wartość bool
  62. */
  63. private function extensionIsAvailable($ext)
  64. {
  65. if (false !== array_search(strtolower($ext), $this -> extensions))
  66. return true;
  67.  
  68. return false;
  69. }
  70.  
  71. /**
  72. *Zwróć liste folderów jakie znajdują się w aktualnym
  73. */
  74. public function getDirs()
  75. {
  76. return $this -> dirs;
  77. }
  78.  
  79. /**
  80. *Usuwa wybrane przez nas pliki
  81. */
  82. public function delete($file)
  83. {
  84. $deleted = 0;
  85. if (is_array($file))
  86. foreach($file as $fileName)
  87. {
  88. $extension = $this -> getExtension($fileName);
  89.  
  90. if (true === $this -> extensionIsAvailable($extension) && file_exists($this -> dir.$fileName))
  91. {
  92. $deleted++;
  93. unlink($this -> dir.$fileName);
  94. }
  95. }
  96. else
  97. {
  98. $extension = $this -> getExtension($file);
  99.  
  100. if (true === $this -> extensionIsAvailable($extension) && file_exists($this -> dir.$file))
  101. {
  102. $deleted++;
  103. unlink($this -> dir.$file);
  104. }
  105. }
  106.  
  107. return $deleted;
  108. }
  109.  
  110. /**
  111. *Skanuj katalog i zwróć tablicę z wszystkimi plikami
  112. */
  113. public function scanDir($dir=null)
  114. {
  115. if (!isset($dir) && !isset($this -> dir))
  116. throw new FilesException('Nie podałeś katalogu który chcesz skanować!');
  117.  
  118. if (isset($dir))
  119. $this -> setDir($dir);
  120.  
  121. $handle = openDir($this -> dir);
  122.  
  123. $files = array();
  124.  
  125. while(false !== ($fileName = readdir($handle)))
  126. {
  127. $extension = explode('.', $fileName);
  128. $extension = end($extension);
  129.  
  130. if (true === $this -> extensionIsAvailable($extension))
  131. {
  132. $files[] = $fileName;
  133. }
  134.  
  135. if(is_dir($this -> dir.$fileName) && $fileName != '.' && $fileName != '..')
  136. {
  137. $this -> dirs[] = $fileName;
  138. }
  139. }
  140.  
  141. return $files;
  142. }
  143.  
  144. /**
  145. *Wysyła plik do odpowiedniego katalogu($this -> dir)
  146. *
  147. *Dodatkowe opcje:
  148. *['max_size']- Maksymalny rozmiar pliku w kb
  149. *['name']-Nowa nazwa, jeśli ma być zmieniona
  150. *Jeśli plik jest obrazkiem
  151. *['width']- Szerokośc jaka ma być nadana obrazkowi
  152. *['height']- Szerokośc jaka ma być nadana obrazkowi
  153. *
  154. *Zwraca nazwe pliku, jeśli zostanie poprawnie wysłany
  155. */
  156. public function upload($file, array $options=null)
  157. {
  158. if (!isset($this -> dir))
  159. throw new ImagesException('Nie podanko katalogu na którym mają być wykonywane działania');
  160.  
  161. $size = round($file['size']/1024);
  162.  
  163. $extension = $this-> getExtension($file['name']);
  164.  
  165. if (false === $this -> extensionIsAvailable($extension))
  166. throw new FilesException('Nie można uploadować pliku o takim rozszeżeniu!');
  167.  
  168. //Sprawdź czy zarządano zmiany nazwy
  169. if (isset($options['name']))
  170. $newName = $options['name'].'.'.$extension;
  171. else
  172. $newName = $file['name'];
  173.  
  174. $newPath = $this->dir.$newName;
  175.  
  176. //Sprawdź maksymalny rozmiar
  177. if (isset($options['max_size']) && $size > $options['max_size'])
  178. throw new FilesException('Rozmiar uploadowanego pliku jest za wielki! Maksymalny rozmiar pliku jaki można wysłać to: '.$options['max_size'].' kb a ty próbowałeś wysłać plik o wadze '.$size.' kb');
  179.  
  180. if (false === move_uploaded_file($file['tmp_name'], $newPath))
  181. throw new FilesException('Plik nie został przkeazany przez odpowiedni formularz!');
  182. else
  183. {
  184. //Jeśli plik jest obrazkiem zmień mu rozmiary
  185. if (isset($this -> imageHeaders[$extension]))
  186. {
  187. if (isset($options['width']))
  188. $width = $options['width'];
  189. if (isset($options['height']))
  190. $height = $options['height'];
  191.  
  192. //Jeśli który kolwiek rozmiar istnieje to wykoanaj zmianę rozmiarów
  193. if (isset($width) || isset($height))
  194. {
  195. $this -> imageResize($newPath, $width, $height);
  196. }
  197. }
  198. }
  199.  
  200. return $newName;
  201. }
  202.  
  203. /**
  204. *Zwróci rozrszezenie pliku
  205. */
  206. public function getExtension($path)
  207. {
  208. $extension = explode('.', $path);
  209. return end($extension);
  210. }
  211.  
  212. /**
  213. *Zmień rozmiar obrazka
  214. */
  215. public function imageResize($path, $width, $height)
  216. {
  217. $extension = $this-> getExtension($path);
  218. list($oldWidth, $oldHeight) = getimagesize($path);
  219.  
  220. //Sprawdź czy szerokośc i wysokosc jest procentowa(przekazane mniejsze od 0)
  221. $width = ($width < 1) ? $oldWidth * $width : $width;
  222. $height = ($height < 1) ? $oldHeight * $height : $height;
  223.  
  224. $newImage = imagecreatetruecolor($width, $height);
  225. $tmpImage = $this -> imageHeaders[$extension]['f']($path);
  226. imagecopyresampled($newImage, $tmpImage, 0, 0, 0, 0, $width, $height, $oldWidth, $oldHeight);
  227.  
  228. //Zapisz obrazek
  229. $this -> imageHeaders[$extension]['fs']($newImage, $path);
  230. }
  231.  
  232. /**
  233. *Ustaw katalog na jakim będziemy pracowali
  234. */
  235. public function setDir($dir)
  236. {
  237. if (is_dir($dir))
  238. $this -> dir = $dir;
  239. else
  240. throw new FilesException('Katalog który próbujesz przeszukać jest nie poprawny lub nie istnieje!');
  241.  
  242. return $this -> dir;
  243. }
  244. }
  245.  
  246. class FilesException extends Exception {}
Mephis
Nie za bardzo umiem się posługiwać klasami... Mógłbyś mnie objaśnić, jak zastosować to do skryptu uploadu?
DarV
Proponuje wykorzystać tutaj phpthumb http://phpthumb.gxdlabs.com/download.php , biblioteka ta posiada wszystkie opcje które cię interesują i łatwo jest je wdrożyć:

np.
  1. $thumb = PhpThumbFactory::create('offerlogos/'.$u_nazwa.'');
  2. $thumb->adaptiveResize(270, 180);
  3. $thumb->save(''.$newname2.'');
Mephis
Cóz.. jak mówiłem wcześniej trudne jest dla mnei zastosowanie większych skryptów... Poluję na jakiś prosty.. Znalazłem taki oto skrypt:

  1. <form action="" method="post" enctype="multipart/form-data">
  2. <input name="image" type="file">
  3. <input name="" type="submit">
  4. </form>
  5.  
  6. <?php
  7.  
  8. // >> UPLOAD <<
  9. $plik_tmp = $_FILES['image']['tmp_name'];
  10. $plik_nazwa = $_FILES['image']['name'];
  11.  
  12. $save_file = $plik_nazwa;
  13.  
  14.  
  15. if(is_uploaded_file($plik_tmp)) {
  16. move_uploaded_file($plik_tmp, ''.$save_file.'');
  17. echo "wszystko poszlo ok";
  18.  
  19.  
  20.  
  21. // TWORZENIA ZNAKU WODNEGO
  22. $znak = imagecreatefrompng('watermark.png'); // plik który będzie dodany na obraz 03.jpg
  23. $img = imagecreatefromjpeg($save_file); // plik na który będzie nałożony znak downy czyli plik Obrazek1.png
  24.  
  25. $plik_w = imagesx($img); // szerokość pliku 03.jpg
  26. $plik_h = imagesy($img); // wysokość pliku 03.jpg
  27.  
  28. $znaczek_w = imagesx($znak); // szerokość znaczka Obrazek1.png
  29. $znaczek_h = imagesy($znak); // wysokość znaczka Obrazek1.png
  30.  
  31.  
  32. $od_x = $plik_w - $znaczek_w; // Wyznaczanie położenie w tym przypadku br czyli dolny prawy róg
  33. $od_y = $plik_h - $znaczek_h; // Wyznaczanie położenie w tym przypadku br czyli dolny prawy róg
  34.  
  35.  
  36. imagecopy($img, $znak, $od_x, $od_y, 0, 0, $znaczek_w, $znaczek_h); // Kopiuje i nakłada na obraz znak downy
  37.  
  38.  
  39. imagejpeg($img, $save_file, 80); // Zapisuje gotowy plik, liczba 100 oznacza jakość obrazu można ustawić od 0 do 100
  40.  
  41.  
  42.  
  43.  
  44.  
  45. // TWORZENIE MINIATURKI
  46. $width = imagesx($img);
  47. $height = imagesy($img);
  48.  
  49.  
  50. $width_mini = 250; // szerokosc obrazka
  51. $height_mini = 170; // wysokosc obrazka
  52. $img_mini = imagecreatetruecolor($width_mini, $height_mini);
  53.  
  54.  
  55. imagecopyresampled($img_mini, $img, 0, 0, 0, 0, $width_mini , $height_mini, $width , $height);
  56.  
  57. $min_save_file = 'min-'.$save_file.''; // nazwa miniaturki
  58.  
  59. imagejpeg($img_mini, $min_save_file, 90); // utworzona miniaturka liczba (80) oznacza jakos obrazka od 0 do 100
  60. imagedestroy($img);
  61. imagedestroy($img_mini);
  62. }
  63.  
  64. ?>


..niby jest ok, tzn: obraz jest wgrywany do dobrych rozmiarów, pod podaną nazwą. Tak jak chciałem - tworzy on miniaturkę zdjęcia, też pod inną nazwą... ...niestety jest to kolejny skrypt, który zawodzi, gdyż miniaturka obrazu przesłana na serwer jest wypełniona kolorem czarnym. To 3 skrypt który tak działa. Borykał już się ktoś z podobnym problemem?
kazmij
Zainteresuj się biblioteką PHPThumb. Jednak możesz Nią tylko zmiejszać zdjęcia.
Mephis
Problem został rozwiązany. Użyłem tego i bardzo polecam - w końcu coś prostego i niezawodnego, w dodatku z mnóstwem opcji biggrin.gif
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.