Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Funkcje imagejpeg/png/gif
Forum PHP.pl > Forum > Przedszkole
stefik4
  1. function resample($filename, $width, $height){
  2. list($width_orig, $height_orig) = getimagesize($filename);
  3. if ($width && ($width_orig < $height_orig)) {
  4. $width = ($height / $height_orig) * $width_orig;
  5. } else {
  6. $height = ($width / $width_orig) * $height_orig;
  7. }
  8. $image_p = imagecreatetruecolor($width, $height);
  9.  
  10. $arr = array('imagecreatefromjpeg','imagecreatefrompng','imagecreatefromgif');
  11.  
  12. foreach ($arr as $val) {
  13. $image = @$val($filename);
  14. if ($image !== false) { break; }
  15. }
  16.  
  17. if ($image === false) {
  18. print('to nie jest zaden obrazek!');
  19. }
  20.  
  21. preg_match("'(.*)\.(.*)$'i", $fil
  22.  
  23. ename, $ext);
  24.  
  25. imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
  26.  
  27.  
  28. $arr2 = array('imagejpeg','imagepng','imagegif');
  29. foreach ($arr2 as $val2) {
  30. $imagek = @$val2($image_p,"logo.".$ext[2], 100);
  31. if ($imagek !== false) {@$val2($image_p,"logo.".$ext[2], 100); break; }
  32. }
  33.  
  34. if ($imagek === false) {
  35. print('to nie jest zaden obrazek!');
  36. }
  37. }
  38.  
  39. resample('http://mobileinfo.xon.pl/smt/gf.png',130,130);
  40.  


Działa ok, tylko w obrazku tym stworzonym png, powinno być tło przeźroczyste: http://speedway-world.pl/logo.png, a nie jest ;/
Rozszerzenie jest w porządku png, ale typ obrazka jest jpg i stąd się bierze chyba błąd, że wciąż działa funkcja imagejpeg, a powinna imagepng.

Nie wiem już cos z tym zrobić.
lukaskolista
  1. $arr2 = array('imagejpeg','imagepng','imagegif');
  2. foreach ($arr2 as $val2) {
  3. $imagek = @$val2($image_p,"logo.".$ext[2], 100);
  4. if ($imagek !== false) {@$val2($image_p,"logo.".$ext[2], 100); break; }
  5. }
  6.  
  7. if ($imagek === false) {
  8. print('to nie jest zaden obrazek!');
  9. }

ten fragment kodu jest zle. Do tego stosujesz jakas dziwna konstrukcje, ale pominmy to. Po co uzywasz @? Nie tlum bledow, to zobaczysz co jest zle.

  1. @$val2($image_p,"logo.".$ext[2], 100)
nie przeczytales dokumentacji funkcji imagegif, (odsylam do niej http://php.net/manual/en/function.imagegif.php). Wylacz tlumienie bledow, zobacz co jest zle i popraw. Dodatkowo na poczatku skryptu mozesz umiescic linijke
co ulatwi sprawe. Jak juz dojdziesz do wniosku, ze petla w ktorej tworzysz obrazki nie ma sensu, to popraw ten skrypt i pokaz nam poprawiony. Swoja droga w sieci jest masa gotowcow, nie wiem czemu tworzysz takie "cudo".

Edit:
zamiast print uzywaj echo, zamiast " uzywaj '
stefik4
Usunąłem @ i pokazuje, że w początkowej cześć gdzie robię:

  1. $arr = array('imagecreatefromjpeg','imagecreatefrompng','imagecreatefromgif');
  2.  
  3. foreach ($arr as $val) {
  4. $image = $val($filename);
  5. if ($image !== false) { break; }
  6. }
  7.  
  8. if ($image === false) {
  9. print('to nie jest zaden obrazek!');
  10. }


Pokazuje mi błędy:

Kod
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG library reports unrecoverable error: in /home/speedway/domains/speedway-world.pl/public_html/resize.php on line 15

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: 'http://mobileinfo.xon.pl/smt/gf.png' is not a valid JPEG file in /home/speedway/domains/speedway-world.pl/public_html/resize.php on line 15


A taka petle foreach zrobiłem ponieważ gdy obrazek ma rozszerzenei png, to jego Content Type może być PNG, i zeby temu zaradzić robie ta petle, i jesli jets poprawna funkja to idzie dalej jesli nie przeszukuje funkcje dalej. Jeśli masz jakis inny pomysł jak to rozwiązać był bym wdzięczny winksmiley.jpg
lukaskolista
to teraz przetlumacz te bledy i masz rozwiazanie. Blad nie jest w poczatkowej czesci skryptu, tylko w 15 linijce (na koncu bledu jest podana linijka)

Cytat
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: 'http://mobileinfo.xon.pl/smt/gf.png' is not a valid JPEG file in /home/speedway/domains/speedway-world.pl/public_html/resize.php on line 15
Ten blad oznacza, ze do funkcji tworzacej obrazek z jpg nie podajesz obrazka jpg.

  1. header('Content-type: image/jpeg');
  2. header('Content-type: image/png');
  3. header('Content-type: image/gif');
dla odpowiedniego obrazka nalezy ustawic odpowiedni naglowek.

Co do petli to konstrukcja jest fatalna, do funkcji imagegif podajesz 3 argument, a ta funckja przyjmuje jedynie 2 argumenty... W dodatku tlumisz ten blad, co nie jest zadnym rozwiazaniem.

  1. if ($type === 'jpg') {
  2. imagejpeg(...);
  3. } else if ($type === 'png') {
  4. imagepng(...);
  5. } else if ($type === 'gif') {
  6. imagegif(...);
  7. }
i po problemie. Takie rozwiazanie po 1 jest duzo bardziej czytelne, po 2 jest jak najbardziej poprawne, a po 3 z pewnoscia skrypt wykona sie szybciej, niz Twoj
stefik4
Ok, ale jak pobiorę zmienna $type ? osttanie 3 znaki z nazwy? A co jesli będzie obrazek z rozszerzeniem png, a jego Content bedzie PNG?
lukaskolista
strtolower();
jednak to nie jest dobre rozwiazanie

  1. $info = getimagesize('obrazek.png');

$info[0] - szerokosc
$info[1] - wysokosc
$info[2] - typ
stefik4
  1. <?php
  2.  
  3. function resample($filename, $width, $height){
  4. list($width_orig, $height_orig,$typ) = getimagesize($filename);
  5. if ($width && ($width_orig < $height_orig)) {
  6. $width = ($height / $height_orig) * $width_orig;
  7. } else {
  8. $height = ($width / $width_orig) * $height_orig;
  9. }
  10. $image_p = imagecreatetruecolor($width, $height);
  11.  
  12. if ($typ === 'jpg') {
  13. $image =imagecreatefromjpeg($filename);
  14. } else if ($typ === 'png') {
  15. $image =imagecreatefrompng($filename);
  16. } else if ($typ === 'gif') {
  17. $image =imagecreatefromgif($filename);
  18. }
  19.  
  20. imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
  21.  
  22. if ($typ === 'jpg') {
  23. imagejpeg($image_p,'logo.'.$typ, 120);
  24. } else if ($typ === 'png') {
  25. imagepng($image_p, 'logo.'.$typ, 1);
  26. } else if ($typ === 'gif') {
  27. imagegif($image_p, 'logo.'.$typ);
  28. }
  29.  
  30.  
  31. }
  32.  
  33. resample('http://mobileinfo.xon.pl/smt/gf.png',130,130);
  34.  
  35. ?>


Jednak otrzymuje błąd argumentu:
Kod
Warning: imagecopyresampled(): supplied argument is not a valid Image resource in /home/speedway/domains/speedway-world.pl/public_html/resize.php on line 20
lukaskolista
w pliku resize.php ustaw odpowiedni naglowek, jak to zrobic pokazalem 2 moje posty wczesniej
stefik4
Ale plik resize zrobiłem tylko testowo, docelowo skrypt ma służyć na podstronie php do zmniejszania loga użytkownika i wstawiania go do sygnaturki, więc nie moge nic robić z nagłówkami. Ogolnie jest tak:

- użytkownik podaje swoje logo np 200 x 200. ja je muszę zmneiszyć do 130 x 130 i wstawić w sygnaturkę.

Z plikami JPG nei ma problemu bo nie ma przezroczystości, zas w PNG przezroczystość jest potrzebna bo takie coiś brzydko wygląda:

http://speedway-world.pl/sygnaturki/1.jpg
lukaskolista
jezeli do imagecreatefromjpeg jako obrazek podajesz skrypt php, to nie masz sie co dziwic, ze nie dziala. Poza przezroczystoscia png zwroc uwage na to, jak przegladarki traktuja przezroczystosc obrazkow. Jezeli to jest do jakiejs gry i gra jest Twoja, to wyslij linka na PW, chetnie zagram.
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.