Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Funkcje imagejpeg/png/gif
stefik4
post
Post #1





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

Ostrzeżenie: (0%)
-----


  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ć.

Ten post edytował stefik4 23.12.2010, 14:26:15
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
lukaskolista
post
Post #2





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


  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 '

Ten post edytował lukaskolista 23.12.2010, 15:28:23
Go to the top of the page
+Quote Post
stefik4
post
Post #3





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
lukaskolista
post
Post #4





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


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

Ten post edytował lukaskolista 23.12.2010, 17:05:32
Go to the top of the page
+Quote Post
stefik4
post
Post #5





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
lukaskolista
post
Post #6





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


strtolower();
jednak to nie jest dobre rozwiazanie

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

$info[0] - szerokosc
$info[1] - wysokosc
$info[2] - typ
Go to the top of the page
+Quote Post
stefik4
post
Post #7





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

Ostrzeżenie: (0%)
-----


  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
Go to the top of the page
+Quote Post
lukaskolista
post
Post #8





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


w pliku resize.php ustaw odpowiedni naglowek, jak to zrobic pokazalem 2 moje posty wczesniej

Ten post edytował lukaskolista 23.12.2010, 18:22:19
Go to the top of the page
+Quote Post
stefik4
post
Post #9





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
lukaskolista
post
Post #10





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


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.

Ten post edytował lukaskolista 23.12.2010, 18:46:15
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 12:20