Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Skalowanie obrazka jpg do wykorzystania z FPDF
Forum PHP.pl > Forum > PHP
danon198901
Witam,
na początek dodam, że uczę się dopiero języka PHP (na podstawie informacji zaczerpniętych z google oraz książki).
Piszę stronkę dzięki której będę mógł generować dokumenty PDF (ulotki itp). Problem mam następujący, że użytkownik może:
a ) Nie dodawać loga do dokumentu PDF
b ) Dodać wbudowane logo
c ) Wgrać własne logo, które zostanie dodane do dokumentu PDF

Z A i B problemu nie ma, jednak problem pojawia się, gdy użytkownik wrzuci własne zdjęcie, które będzie większe niż ja założyłem...wtedy wyjdzie on za ramy dokomentu, a tego nie chcę. Nie chcę również, narzucić maksymalnej wielkości zdjęcia, które użytkownik wgra. Po prostu jeśli rozdzielczość jest większa powiedzmy od 150x150 px to następuje skalowanie.

W internecie znalazłem najbardziej przemawiający do mnie skrypt php, wg. którego pobierane jest zdjęcie, następuje skalowanie i zapisanie zmienionego obrazka. Sprawdziłem, błędu nie wyrzuca, ale również nie skaluje:(

Poniżej prezentuje znaleziony kod (ścieżka jest moja):

  1. <?php
  2.  
  3. $plik = 'obrazki/slonecznik.jpeg';
  4.  
  5. function resize( $plik, $szerokosc = 55 ) {
  6.  
  7. $i = explode('.', $plik);
  8. $rozszerzenie = end($i);
  9.  
  10. if($rozszerzenie !== 'jpeg' &&
  11. $rozszerzenie !== 'gif' &&
  12. $rozszerzenie !== 'png') {
  13. return false;
  14. }
  15.  
  16. list($img_szer, $img_wys) = getimagesize($plik);
  17.  
  18. $proporcje = $img_wys / $img_szer;
  19. $wysokosc = $szerokosc * $proporcje;
  20.  
  21. $canvas = imagecreatetruecolor($szerokosc, $wysokosc);
  22.  
  23. switch($rozszerzenie) {
  24. case 'jpeg':
  25. $org = imagecreatefromjpeg($plik);
  26. break;
  27. case 'gif':
  28. $org = imagecreatefromgif($plik);
  29. break;
  30. case 'png':
  31. $org = imagecreatefrompng($plik);
  32. break;
  33. }
  34.  
  35. imagecopyresampled($canvas, $org, 0, 0, 0, 0,
  36. $szerokosc, $wysokosc, $img_szer, $img_wys);
  37.  
  38. if(imagejpeg($canvas, $plik, 70)) {
  39. return true;
  40. } else {
  41. return false;
  42. }
  43. }
  44. ?>


Jakieś sugestie? worriedsmiley.gif
wladimirec
Funkcje przetestowałem, zdaje się działać prawidłowo i jak najbardziej skaluje zdjęcie.
Upewnij się, że masz odpowiednie uprawnienia do zapisu pliku. Funkcja nadpisuje plik.

A poza tym we wklejonym przez Ciebie fragmencie brakuje tylko wywołania funkcji resize.
danon198901
Cytat
Upewnij się, że masz odpowiednie uprawnienia do zapisu pliku.


Ustawiłem na tym konkretnym obrazku maksymalne prawa (Prawy PM -> Właściwości -> Zabezpieczenia mam nadalne Pełna kontrola/Modyfikacja/Odczyt i wykonanie/Odczyt/Zapis, czyli wsio co tylko mogłem dać).
W Xampp'ie jest dołączona FileZilla, w której z tego co wiem można sprawdzić uprawnienia do plików, jednak w ogóle nie pokazuje mi żadnych plików/folderów. Na szybkiego wrzuciłem fraze w google i wychodzi na to, że będę musiał na routerze zrobić przekierowanie portów.


Cytat
A poza tym we wklejonym przez Ciebie fragmencie brakuje tylko wywołania funkcji resize.


Bez wywołania funkcji nie dostaję błędu, ani obrazek nie jest skalowany. Oto troszkę zmieniony kod:

  1. <?php
  2.  
  3. function resize( $plik, $szerokosc) {
  4.  
  5. $i = explode('.', $plik);
  6. $rozszerzenie = end($i);
  7.  
  8. if($rozszerzenie !== 'jpeg' &&
  9. $rozszerzenie !== 'gif' &&
  10. $rozszerzenie !== 'png') {
  11. return false;
  12. }
  13.  
  14. list($img_szer, $img_wys) = getimagesize($plik);
  15.  
  16. $proporcje = $img_wys / $img_szer;
  17. $wysokosc = $szerokosc * $proporcje;
  18.  
  19. $canvas = imagecreatetruecolor($szerokosc, $wysokosc);
  20.  
  21. switch($rozszerzenie) {
  22. case 'jpeg':
  23. $org = imagecreatefromjpeg($plik);
  24. break;
  25. case 'gif':
  26. $org = imagecreatefromgif($plik);
  27. break;
  28. case 'png':
  29. $org = imagecreatefrompng($plik);
  30. break;
  31. }
  32.  
  33. imagecopyresampled($canvas, $org, 0, 0, 0, 0,
  34. $szerokosc, $wysokosc, $img_szer, $img_wys);
  35.  
  36. if(imagejpeg($canvas, $plik, 70)) {
  37. return true;
  38. } else {
  39. return false;
  40. }
  41. }
  42.  
  43. resize('obrazki/slonecznik.jpeg', 150);
  44.  
  45. ?>


Bez wywołania "resize('obrazki/slonecznik.jpeg', 150);" nie dostaję żadnych błędów, ale i obrazek nie jest skalowany. Po wywołaniu funkcji dostaję następujące błędy:

Cytat
Warning: getimagesize(obrazki/slonecznik.jpeg) [function.getimagesize]: failed to open stream: No such file or directory in C:\xampp\htdocs\testowanie\scale.php on line 14

Warning: Division by zero in C:\xampp\htdocs\testowanie\scale.php on line 16

Warning: imagecreatetruecolor() [function.imagecreatetruecolor]: Invalid image dimensions in C:\xampp\htdocs\testowanie\scale.php on line 19

Warning: imagecreatefromjpeg(obrazki/slonecznik.jpeg) [function.imagecreatefromjpeg]: failed to open stream: No such file or directory in C:\xampp\htdocs\testowanie\scale.php on line 23

Warning: imagecopyresampled() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\testowanie\scale.php on line 34

Warning: imagejpeg() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\testowanie\scale.php on line 36



Załamka:(
wladimirec
Cytat
Warning: getimagesize(obrazki/slonecznik.jpeg) [function.getimagesize]: failed to open stream: No such file or directory in C:\xampp\htdocs\testowanie\scale.php on line 14


Pierwszy komunikat błędu mówi, że skrypt nie może załadować pliku.
Proponuje sprawdzić, czy aby na pewno ścieżka do pliku jest prawidłowa.
Jeśli nie jesteś pewny ścieżki relatywnej do pliku to najlepiej zacznij od użycia ścieżki absolutnej do pliku (typu 'C:\xampp\htdocs\obrazki\sloneczniki.jpeg')
albo dla testu umieść obrazek w tym samym katalogu co skrypt i w funkcji jako pierwszy parametr użyj tylko nazwy pliku.
A dla pewności zawsze możesz użyć file_exists

Cytat
Bez wywołania "resize('obrazki/slonecznik.jpeg', 150);" nie dostaję żadnych błędów, ale i obrazek nie jest skalowany.

...co świadczy o tym, że składnia funkcji jest prawidłowa, a problem może wynikać z winy jej parametru wink.gif
danon198901
Cytat
albo dla testu umieść obrazek w tym samym katalogu co skrypt i w funkcji jako pierwszy parametr użyj tylko nazwy pliku.

Już wczoraj próbowałem i kończy się to tymi samymi komunikatami:(

Cytat
Jeśli nie jesteś pewny ścieżki relatywnej do pliku to najlepiej zacznij od użycia ścieżki absolutnej do pliku


Stosując: resize('C:\xampp\htdocs\obrazki\sloneczniki.jpeg', 150);
również dostaję te warningi.

Co do file exist...wcześniej mogę sobie wywołać <img src... /> i obrazek mi się wyświetli...czyli istnieje i jest 'widoczny'.


Cytat
A dla pewności zawsze możesz użyć file_exists


Odwołując się do funkcji file_exist:
  1. <?php
  2.  
  3. function resize( $plik, $szerokosc) {
  4.  
  5.  
  6. if(file_exists($plik))
  7. {
  8.  
  9. echo 'Plik istnieje';
  10.  
  11. $i = explode('.', $plik);
  12. $rozszerzenie = end($i);
  13.  
  14. if($rozszerzenie !== 'jpeg' &&
  15. $rozszerzenie !== 'gif' &&
  16. $rozszerzenie !== 'png') {
  17. return false;
  18. }
  19.  
  20. list($img_szer, $img_wys) = getimagesize($plik);
  21.  
  22. $proporcje = $img_wys / $img_szer;
  23. $wysokosc = $szerokosc * $proporcje;
  24.  
  25. $canvas = imagecreatetruecolor($szerokosc, $wysokosc);
  26.  
  27. switch($rozszerzenie) {
  28. case 'jpeg':
  29. $org = imagecreatefromjpeg($plik);
  30. break;
  31. case 'gif':
  32. $org = imagecreatefromgif($plik);
  33. break;
  34. case 'png':
  35. $org = imagecreatefrompng($plik);
  36. break;
  37. }
  38.  
  39. imagecopyresampled($canvas, $org, 0, 0, 0, 0,
  40. $szerokosc, $wysokosc, $img_szer, $img_wys);
  41.  
  42. if(imagejpeg($canvas, $plik, 70)) {
  43. return true;
  44. } else {
  45. return false;
  46. }
  47. }
  48.  
  49. else echo 'Plik nie istnieje';
  50. }
  51.  
  52. resize('obrazki/sloneczniki.jpeg', 150);
  53.  
  54. ?>


Moim oczom ukazuje się informacja "Plik nie istnieje" nerdsmiley.png


@EDIT
No nie wierzę...sprawdzałem poprawność ścieżki kilkakrotnie...a okazuje się, że w skrypcie miałem nazwę sloneczniki, a plik nazywa sie slonecznik. Ehhh, ale wstyd:P

Dzięki za pomoc @wladimirecwink.gif Tematu jeszcze nie zamykam, bo mam kilka zamysłów co do obrazków w php i być może odwołam się jeszcze w tym temacie.
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.