Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jaki błąd jest w tej funkcji ?
Forum PHP.pl > Forum > Gotowe rozwiązania
primo
Witam,

funkcja wygląda następująco:

  1. <?php
  2.  
  3.  
  4. function resize($imgName, $size)
  5. {
  6. if(!($img = imagecreatefromjpeg($imgName))){
  7. echo(&#092;"Nie mogę otworzyć pliku: $imgName\");
  8. return false;
  9. }
  10.  
  11. $img_w = imagesx($img);
  12. $img_h = imagesy($img);
  13.  
  14. $ratio = $img_w / $img_h;
  15.  
  16. if($ratio > 1){
  17. $new_img_w = $size;
  18. $new_img_h = ($size / $ratio);
  19. }
  20. else{
  21. $new_img_w = ($size * $ratio);
  22. $new_img_h = $size;
  23. }
  24.  
  25. $tempImg = imagecreatetruecolor($new_img_w, $new_img_h);
  26. imagecopyresampled($tempImg, $img, 0, 0, 0, 0, 
  27. $new_img_w, $new_img_h, $img_w, $img_h);
  28.  
  29. $name = substr($imgName, 0, strlen($imgName) - 5);
  30. $name = $name.&#092;"-resized.jpg\";
  31.  
  32. imagejpeg($tempImg, $name);
  33. }
  34.  
  35. resize(&#092;"super_size_me.jpg\", 120);
  36.  
  37.  
  38. ?>


problem wygląda następująco: chciałbym tą funkcję zastosować w innej funkcji, ale nie wiem jak.

funkcja wygląda tak:

  1. <?php
  2.  
  3.  
  4. function opis_filmu()
  5. {
  6.  
  7. global $id;
  8. if($id){
  9. $query=&#092;"select * from filmy where id='$id'\"; 
  10. $result=mysql_query($query);
  11. while ( $row = mysql_fetch_row($result) )
  12. { 
  13.  
  14. $okladka = $row[4];
  15. $foto=$row[4];
  16. $name=$row[4];
  17. $foto = resize(&#092;"$foto\", 350);
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  echo &#092;"<table cellpadding=5 cellspacing=0 class=podmenu_opis>\";
  25.  echo&#092;"  <tr>
  26.  <td class=okladka><img src='graphics/okladki/$foto' border='0' ALT='$name'></td>
  27.  
  28.  
  29. ?>


nie jest to cała funkcja bo nie ma sensu jej tu dawać. Chodzi mi mianowicie o to aby zmienną foto przekształcić funkcją resize, jak bym nie dał zapisu to ciągle wyskakuje Nie mogę otworzyć pliku: aktualna_nazwa_dotyczaca_jakiegos_tam_filmu.jpg - zwróćcie uwagę, że ta zmienna foto odwołuje sie do innego katalogu aniżeli funkcja resize (nie wiem czy to wazne).
tiraeth
  1. <?
  2. $foto = resize($foto, 350);
  3. ?>

zmienna $foto musi przetrzymywać nazwę pliku do resize'ingu smile.gif nie umieszczaj jej w cudzysłowiach tongue.gif
primo
zdaje się że to nie jest aż tak banalne, jak się wydaje. Próbowałem już z cudzysłowami, z apostrofami i bez, ale nic z tego.

dodałem nawet:

  1. <?php
  2.  
  3.  
  4. $foto=$row[4];
  5. $name=$row[4];
  6. $foto = substr($foto, 0, strlen($foto) - 4);
  7. $foto = $foto.&#092;"-resized.jpg\";
  8. $foto = resize($foto, 350);
  9.  
  10.  
  11. ?>


ale nadal nici. Tak się zastanawiam czy może zachodzić konflikt nazw, że w jednej i drugiej występuje zmienna name, ale pochodząca z różnych źródeł questionmark.gifquestionmark.gif
nibytak
ja to zrobilem tak:

  1. <?php
  2.  
  3. function resize($imgName, $size)
  4. {
  5.  
  6. // funkcja z 1 postu - nic nie zmienilem az do:
  7.  
  8.   imagejpeg($tempImg, $name);
  9.  
  10.   // tu dodalem:
  11.   return $name;
  12. }
  13.  
  14. ?>


i przykladowe wywolanie:

  1. <?php
  2.  
  3.     $foto = resize('mapa-akita.JPG', 500);
  4.  
  5.     echo '<img src=\"'.$foto.'\" alt=\"'.$foto.'\" />';
  6.  
  7. ?>


i zadzialalo. przy okazji - obcielo mi ostatnia litere z nazwy pliku obrazka (zostalo 'mapa-akit').
primo
obcięło Ci ponieważ w linii kodu powinno być -4 a nie:

  1. <?php
  2.  
  3. $name = substr($imgName, 0, strlen($imgName) - 5);
  4. ?>


a mnie to jednak nie działa ;(

Nie mam już pomysłów co możnaby w tym poprawić.

Najdziwniejsze w tym jest to, że jak dam odwołanie w ten sposób:

  1. <img src="rysunek.jpg">
  2. resize("rysunek.jpg", 350);
  3. <img src="rysunek-resized.jpg">


to funkcja działa, a jak daję:

  1. <?php
  2.  
  3. $foto = resize($foto, 70);
  4.  
  5. ?>

to już nie działa questionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gif?
stoprocent
  1. <?php
  2.  
  3. function resize($imgName, $size)
  4. {
  5. if(!($img = imagecreatefromjpeg($imgName))){
  6. echo(&#092;"Nie moge^ otworzy? pliku: $imgName\");
  7. return false;
  8. }
  9.  
  10. $img_w = imagesx($img);
  11. $img_h = imagesy($img);
  12.  
  13. $ratio = $img_w / $img_h;
  14.  
  15. if($ratio > 1){
  16. $new_img_w = $size;
  17. $new_img_h = ($size / $ratio);
  18. }
  19. else{
  20. $new_img_w = ($size * $ratio);
  21. $new_img_h = $size;
  22. }
  23.  
  24. $tempImg = imagecreatetruecolor($new_img_w, $new_img_h);
  25. imagecopyresampled($tempImg, $img, 0, 0, 0, 0,
  26. $new_img_w, $new_img_h, $img_w, $img_h);
  27.  
  28. $name = substr($imgName, 0, strlen($imgName) - 5);
  29. $name = $name.&#092;"-resized.jpg\";
  30.  
  31. imagejpeg($tempImg, $name, 75);
  32. imagedestroy($tempImg);
  33.  
  34. return $name;
  35. }
  36.  
  37. ?>

To dziala.
primo
jeżeli obie funkcje działają oddzielnie to dlaczego nie działają w połączeniu questionmark.gif Czy ja czegoś nie rozumię questionmark.gif? Zasieg zmiennych albo coś questionmark.gif
Czy to może być wina tego że ja tą nazwę każdego zdjęcia przetrzymuję w bazie jako zwykły text questionmark.gif Może to trzeba przetworzyć na coś innego questionmark.gif Macie jakieś pomysły questionmark.gif Please.........

tak nadal drążę ten temat:

w momencie jak usunę return false; to wyskakuje: gd-jpeg: JPEG library reports unrecoverable error: Empty JPEG image (DNL not supported) ---- może to kogoś naprowadzi na rozwiązanie mojego problemu questionmark.gif
nibytak
to ja niestety nie wiem jak pomoc sad.gif. pewnie pliki ktore maja byc resiz()wane trzymasz w jednym katalogu - sprawdz przed wywolaniem resize() czy podajesz jej prawidlowy parametr $imgName (np echo $imageName przed pierwszym ifem). zobacz jeszcze gdzie funkcja zapisuje pliki i ew wymus zapis w inna sciezke lub zmodyfikuj tag img. to tyle z mojego skromnego doswiadczenia smile.gif

powodzenia
primo
z tego komunikatu, który uzyskałem po usunięciu return false; wnioskuję, że funkcja otwiera pusty jpg. Tak myślę nad tym co powiedziałeś o tej ścieżce dostępu. Jeśli chodzi o zwracany bła to przy próbie otwarcia zdjęcia funkcja zwraca: Nie moge otworzyć pliku: $imgName - gdzie $imgName jest oczywiście nazwą pobraną z bazy, a więc np. super_size_me.jpg i to wyświetla - samą nazwę, a zdjęcia już nie.

Jak w takim razie w funkcji resize określić położenie tych plików skoro one są w katalogu graphics/okladki/$foto questionmark.gif

zapomniałbym: funkcja resize nie tworzy mi wspomnianych miniaturek, co też jest dziwne...
NuLL
Propblemem może byc zapis danego pliku graficznego gdyż GD nie radzi sobie z iektórymi.
nibytak
przy wywolaniu funkcji podaj sciezke np. :

resize('graphics/okladki/'.$foto, ...);

i to zadziala o ile skrypt jest w katalogu glownym. jesli nie jest to musisz wyjsc z podkatalogu gdzie jest skrypt - uzywa sie do tego '..' - jeden raz lub wielokrotnie - zalezy jakie masz drzewo katalogow. np. jesli masz w katalogu glownym podkatalog 'skrypty' a wnim skrypt z funkcja resize() piszesz:

resize('../graphics/okladki/'.$foto, ...);

moze musisz uzyc tego wielokrotnie (np skrypt z resize() masz w katalogu /skrypty/przegladanieokladek/'):

resize('../../graphics/okladki/'.$foto, ...);

generalnie na tej zasadzie. funkcja resize() utworzy ci miniaturke w tym samym katalogu w ktorym sa okladki czyli /graphics/okladki (przynajmniej u mnie tak to dzialalo). zmienna $foto nie moze zawierac sciezki do pliku. dalej zostaje tylko html - tam odpowiednia sciezka i zalatwione. pokombinuj
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-2024 Invision Power Services, Inc.