Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][GD]Miniaturki w locie
Forum PHP.pl > Forum > PHP
lDoran
Jestem w trakcie pisania modułu witryny skalującego obrazy, niestety nie mogę uporać się z błędem nie mam pojęcia o co kaman. sciana.gif
Efekt widoczny w przeglądarce to trzy jedynki
  1. <?php
  2. class cFileManagerGallery
  3. {
  4. //Obiekty
  5. private $_model;
  6. private $_view;
  7.  
  8. //Dane
  9. private $_arFiles = array(); //Tablica zdjęć
  10. private $_imgW; //Szerokość obrazu
  11. private $_imgH; //Wysokość obrazu
  12. private $_newImgW; //Nowa szerokość obrazu
  13. private $_newImgH; //Nowa wysokość obrazu
  14. private $_ratio; //Stosunek szerokości do wysokości
  15. private $_img; //Uchwyt aktualnego obrazu
  16.  
  17.  
  18. //Uruchamia model, ustawia dane,
  19. //skaluje pliki JPG, uruchamia view
  20. public function __construct()
  21. {
  22. $this -> runModel();
  23. $this -> setData();
  24. $this -> scaleImg();
  25. $this -> runView();
  26. }
  27.  
  28. //Uruchamia model
  29. private function runModel()
  30. {
  31. $this -> _model = new mFileManager('web/gallery/');
  32. }
  33.  
  34. //Wczytuje wszystkie zdjęcia do tablicy _arFiles
  35. private function setData()
  36. {
  37. $this -> _arFiles = ($this -> _model -> getData());
  38. }
  39.  
  40. //Metoda odpowiedziala za przeskalowanie wszystkich
  41. //obrazów z tablicy: _arFiles i zapisanie ich miniatur
  42. //do tablicy: _arNewFles
  43. private function scaleImg()
  44. {
  45. for($i = 0; $i < count($this -> _arFiles); $i++)
  46. {
  47. if(!($this -> _img = imagecreatefromjpeg('web/gallery/' . $this -> _arFiles[$i])))
  48. {
  49. echo 'Nie można otworzyć pliku: ' . $this -> _arFiles[$i];
  50. return false;
  51. }
  52.  
  53. $this -> _imgW = imagesx($this -> _img);
  54. $this -> _imgH = imagesy($this -> _img);
  55. $this -> _ratio = $this -> _imgW / $this -> _imgH;
  56.  
  57. if($this -> _ratio > 1)
  58. {
  59. $this -> _newImgW = 150;
  60. $this -> _newImgH = 150 / $this -> _ratio;
  61. }
  62. else
  63. {
  64. $this -> _newImgW = 150 * $this -> _ratio;
  65. $this -> _newImgH = 150;
  66. }
  67.  
  68. $tempImg = imagecreatetruecolor($this -> _newImgW, $this -> _newImgH);
  69. imagecopyresampled($tempImg, $this -> _img, 0, 0, 0, 0, $this -> _newImgW,
  70. $this -> _newImgH, $this -> _imgW, $this -> _imgH);
  71.  
  72. $this -> _arNewFiles[$i] = imagejpeg($tempImg, $i . '.jpg');
  73. }
  74. }
  75.  
  76. //Uruchamia widok
  77. private function runView()
  78. {
  79. $this -> _view = new vFileManagerGallery($this -> _arFiles ,$this -> _arNewFiles);
  80. }
  81. }
  82. ?>

Pilsener
Piszesz jak widzę, nowy kod, dlaczego nie użyjesz image magicka?
http://pl.php.net/manual/pl/book.imagick.php
lDoran
Cytat(Pilsener @ 27.08.2010, 19:33:14 ) *
Piszesz jak widzę, nowy kod, dlaczego nie użyjesz image magicka?
http://pl.php.net/manual/pl/book.imagick.php

Ponieważ lubię wiedzieć jak coś działa, może kiedy zrozumiem GD to się pobawię w gotowe rozwiązania wstydnis.gif .
Pilsener
Po co rozumieć GD, jest już przestarzałe smile.gif Widzę, że masz jakieś pojęcie o OOP, więc do dzieła - miniaturki w imagicku robisz linijką kodu:
http://pl.php.net/manual/pl/function.imagi...mbnailimage.php
W dodatku te metody mają w sobie coś magicznego i obrazki nie wychodzą koślawe smile.gif

By utworzyć miniaturki wystarczy:
1. Utworzyć obiekt
2. Wykonać metodę thumbnail...
3. Wysłać obiekt do browsera

Parę linijek kodu, możliwości są duże, spójrz choćby na to:
http://blog.zeromski.com.pl/2008/06/miniat...gemagic-imagic/

Warto iść z duchem czasu, parę godzin i masz podstawy imagicka opanowane.
cojack
Po co Ci klasa którą nie możesz sterować?
lDoran
Cytat(cojack @ 27.08.2010, 22:35:15 ) *
Po co Ci klasa którą nie możesz sterować?

to jest kontroler, widok wyświetla do tego jest jeszcze model
cojack
Masz bład logiczny w pętli for, nie używa się count w pętli, tylko przed.
fander
Cytat
Efekt widoczny w przeglądarce to trzy jedynki


$this -> _arNewFiles[$i] = imagejpeg($tempImg, $i . '.jpg'); - co ty tutaj chcesz wsadzić do atrybutu _arNewFiles[$i]

z tego co wiem imagejpeg zwraca bool, true lub false czyli 1 lub 0 http://www.php.net/manual/en/function.imagejpeg.php

jeśli chcesz gdzieś przechować info o uchwycie do tych plików musiałbyś zrobić tak
imagejpeg($tempImg, $i . '.jpg'); <= zapisujesz pod nazwą $i.jpg (ścieżką?) plik w takim razie ścieżka do tego pliku z przeglądarki www wygląda następująco:
twojadomena/scieżka_do_katalogu_z_miniaturkami/nazwa_miniaturk.jpg ($i ?)

czyli do atrybutu _arNewFiles[$i] powinieneś zapisać ścieżkę do tego pliku


Twoje rozwiązanie jest trochę mylne, powinieneś zrobić pliczek resize.php gdzie umieścisz powyższy kod a następnie w miejscu gdzie wyświetlasz obrazek (kod HTML) dajesz
Kod
<img src="mojadomena/resize.php?nazwapliku=plik&szerokosc=szerokosc&wysokosc=wysokosc" alt="nazwa obrazka" />


skoro to moduł to w routerze ustaw wywołanie akcji tego modułu z podanymi parametrami czyli w routerze (.htaccess) tak aby wywołanie
mojadomena/resize_image/image_name-x-y.jpg zwracało ci konkretną miniaturkę o szerokości x i wysokości y lub na odwrót smile.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.