Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Upload obrazków
Forum PHP.pl > Forum > PHP
Bajki
Witam
dopiero zaczynam zabawe z biblioteką GD i mam pewne pytanie z serii 'czy dobrze rozumuje' ;P
z tego co widze w przykładach, biblioteka ta moze dokonywac operacjii na plikach juz wrzuconych na serwer.

Oto co powinno sie dziać :
1. Użytkownik wybiera obrazek z dysku w formularzu i wciska 'wyślij'
2. Tworzone są 3 wersje pliku :
*miniatura
*średni rozmiar
*maksymalny rozmiar (jednak nie taki jak oryginal ale z jakimiś limitami wysokości i szerokości winksmiley.jpg )


i teraz moje pytanie, czy taki sposób wrzucania pliku jest wydajny, nie przekombinowany i cyz nie istnieja jakies prostsze sposoby winksmiley.jpg oto pomysł :

1. Upload pliku do jakiegoś tymczasowego folderu TEMP (w oryginalnych rozmiarach)
2. Stworzenie miniatury, stworzenie średniego formatu i stworzenie najwiekszej wersjii przy pomocy biblioteki GD oraz zapisywanie tych wersjii w odpowiednich folderach
3. Usunięcie oryginalnego pliku z folderu TEMP

Prosze o jakieś pomysły i sugestie smile.gif

Pozdrawiam
marcio
A o co dokladnie chodzi??

Nie potrafisz zrobic funckji skalujacej nie wiesz jak napisac upload czy pytasz sie czy mozna zrobic tak jak ty piszesz jesli tak to odpowiedz jest tak smile.gif, jesli prosisz o szczegoly napisz co dokladnie chcesz wiedziec

Cytat
czy taki sposób wrzucania pliku jest wydajny

TEgo to ci nie powiem bo nie wiem czy mozna to jakos w locie zrobic nie wgrywajac pliku na server wiec niech inni sie wypowiedza
Bajki
hmm no wsumie to wyjasniles wszystko co chcialem wiedziec winksmiley.jpg

jednak pojawia sie problem, otoz majac taki skrypt :

  1. <?php
  2. header("Content-type: image/jpeg");
  3. class Obrazek {
  4. private $obrazek;
  5. function __construct ( $sciezka_pliku_jpg ) {
  6. $this->obrazek = @imagecreatefromjpeg( $sciezka_pliku_jpg )
  7. or die( "Nie można zainicjować strumienia GD" );
  8. }
  9. function destruct() {
  10. imagedestroy ( $this->obrazek );
  11. }
  12. public function resize ( $tbx , $tby ) {
  13. $ow = imagesx($this->obrazek);
  14. $oh = imagesy($this->obrazek);
  15. $mid['ow'] = $tbx;
  16. $mid['oh'] = $tby;
  17. if ( $ow > $oh and $mid['oh'] > $oh) {
  18. $mid['width'] = $mid['ow'];
  19. $mid['height'] = $oh/$ow * $mid['ow'];
  20. $mid_pot['width'] = 0;
  21. $mid_pot['height'] = ($mid['oh'] - $mid['height']) / 2;
  22. } 
  23. else {
  24. $mid['height'] = $mid['oh'];
  25. $mid['width'] = $ow/$oh * $mid['oh'];
  26. $mid_pot['height'] = 0;
  27. $mid_pot['width'] = ($mid['ow'] - $mid['width']) / 2;
  28. }
  29. $tb = imagecreatetruecolor ( $mid['ow'], $mid['oh'] );
  30. imagecopyresized ( $tb , $this->obrazek , $mid_pot['width'],
  31. $mid_pot['height'], 0, 0,
  32. $mid['width'], $mid['height'], $ow, $oh );
  33. return $tb;
  34. }
  35. }
  36.  
  37. $obiektObrazka = new Obrazek ( "img.jpg" );
  38. imagejpeg ( $obiektObrazka->resize (160, 90) );
  39. ?>


wywala mi
  1. Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in C:\Program Files\WebServ\httpd\img\img.php on line 4


Myslalem ze pracujac na przykladach jakos dojde jak obsluguje sie GD no ale troche sie mylilem jak widze ;P
em1X
Ludzie, czy wy nie macie tabulatorów tylko piszecie wszystko jednym ciurkiem.. to tak jak pisać wypracowanie bez kropek i przecinków. Potem się dziwisz, że błędów nie potrafisz znaleźć.

1) powinno być __destruct nie destruct()

  1. <?php
  2. class Obrazek
  3. {
  4. private $obrazek;
  5.  
  6. function __construct ( $sciezka_pliku_jpg )
  7. {
  8. $this->obrazek = @imagecreatefromjpeg( $sciezka_pliku_jpg ) or die( "Nie mo�na zainicjowa� strumienia GD" );
  9. }
  10.  
  11. function __destruct()
  12. {
  13. imagedestroy ( $this->obrazek );
  14. }
  15.  
  16. public function resize ( $tbx , $tby )
  17. {
  18. $ow = imagesx($this->obrazek);
  19. $oh = imagesy($this->obrazek);
  20. $mid['ow'] = $tbx;
  21. $mid['oh'] = $tby;
  22.  
  23. if ( $ow > $oh and $mid['oh'] > $oh)
  24. {
  25. $mid['width'] = $mid['ow'];
  26. $mid['height'] = $oh/$ow * $mid['ow'];
  27. $mid_pot['width'] = 0;
  28. $mid_pot['height'] = ($mid['oh'] - $mid['height']) / 2;
  29. } 
  30. else
  31. {
  32. $mid['height'] = $mid['oh'];
  33. $mid['width'] = $ow/$oh * $mid['oh'];
  34. $mid_pot['height'] = 0;
  35. $mid_pot['width'] = ($mid['ow'] - $mid['width']) / 2;
  36. }
  37.  
  38. $tb = imagecreatetruecolor ( $mid['ow'], $mid['oh'] );
  39. imagecopyresized ( $tb , $this->obrazek , $mid_pot['width'],
  40. $mid_pot['height'], 0, 0,
  41. $mid['width'], $mid['height'], $ow, $oh );
  42.  
  43. return $tb;
  44. }
  45. }
  46.  
  47. header("Content-type: image/jpeg");
  48.  
  49. $obiektObrazka = new Obrazek ( "img.jpg" );
  50. imagejpeg ( $obiektObrazka->resize (160, 90) );
  51. ?>


Kod jest dobry. Tylko Ty masz stare PHP w wersji 4, do tego skryptu wymagane jest PHP w wersji >5.
Wersja PHP4:

  1. <?php
  2. class Obrazek
  3. {
  4. var $obrazek;
  5.  
  6. function Obrazek ( $sciezka_pliku_jpg )
  7. {
  8. $this->obrazek = @imagecreatefromjpeg( $sciezka_pliku_jpg ) or die( "Nie mo�na zainicjowa� strumienia GD" );
  9. }
  10.  
  11. function __destruct()
  12. {
  13. imagedestroy ( $this->obrazek );
  14. }
  15.  
  16. public function resize ( $tbx , $tby )
  17. {
  18. $ow = imagesx($this->obrazek);
  19. $oh = imagesy($this->obrazek);
  20. $mid['ow'] = $tbx;
  21. $mid['oh'] = $tby;
  22.  
  23. if ( $ow > $oh and $mid['oh'] > $oh)
  24. {
  25. $mid['width'] = $mid['ow'];
  26. $mid['height'] = $oh/$ow * $mid['ow'];
  27. $mid_pot['width'] = 0;
  28. $mid_pot['height'] = ($mid['oh'] - $mid['height']) / 2;
  29. } 
  30. else
  31. {
  32. $mid['height'] = $mid['oh'];
  33. $mid['width'] = $ow/$oh * $mid['oh'];
  34. $mid_pot['height'] = 0;
  35. $mid_pot['width'] = ($mid['ow'] - $mid['width']) / 2;
  36. }
  37.  
  38. $tb = imagecreatetruecolor ( $mid['ow'], $mid['oh'] );
  39. imagecopyresized ( $tb , $this->obrazek , $mid_pot['width'],
  40. $mid_pot['height'], 0, 0,
  41. $mid['width'], $mid['height'], $ow, $oh );
  42.  
  43. return $tb;
  44. }
  45. }
  46.  
  47. header("Content-type: image/jpeg");
  48.  
  49. $obiektObrazka = new Obrazek ( "img.jpg" );
  50. imagejpeg ( $obiektObrazka->resize (160, 90) );
  51. $obiektObrazka->__destruct();
  52. ?>
Bajki
Cytat
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in C:\Program Files\WebServ\httpd\img\img.php on line 16
teraz takie cos winksmiley.jpg
em1X
wywal te public w kodzie dla wersji 4.x z linii 16.
Bajki
ok super teraz działa winksmiley.jpg ale jedna sprawa...ten obrazek wygląda strasznie brzydko...tzn. chodzi mi oto, ze wyglada tak jakbym wyświetlał oryginał ale z parametrami width i height w HTMLu...czyli jakosc jest o połowe gorsza niz wersjii większej...

nieda sie czegoś z tym zrobić ?
l0ud
zamień imagecopyresized na imagecopyresampled w kodzie smile.gif
Bajki
ok super ! smile.gif teraz juz wszystko jest jak należy.

Jednak teraz chciałbym wrócić do tego zapisywania...aby zapisać taki wygenerowany przez ten plik obraz musze skorzystać z odpowiednich funkcjii php - zapisać ten plik php jako nazwaobrazka.jpg ? czy istnieje jakiś sprytniejszy sposób... winksmiley.jpg
em1X
jest sprytny sposób ale wymaga nauki czytania co nie wszyscy opanowali

manual -> http://pl.php.net/imagejpeg
l0ud
Jeżeli przekażesz drugi argument do funkcji imagejpeg(), to zapisze ona obrazek do pliku (ścieżka do pliku to właśnie ten argument) zamiast wysłania obrazka do przeglądarki:
  1. <?php
  2. //usunąłem header - nie jest już potrzebny- obrazek zapisze się, a nie wyświetli
  3.  
  4. $obiektObrazka = new Obrazek ( "img.jpg" );
  5. imagejpeg ( $obiektObrazka->resize (160, 90), 'sciezkaplikudozapisu.jpg');
  6. $obiektObrazka->__destruct();
  7. ?>


http://pl.php.net/manual/pl/function.imagejpeg.php
Bajki
hehe no wlasnie udalo mi sie to odkryc chwile przed tym jak napisaliscie biggrin.gif

to juz prawie koniec problemow ale pozostalo jeszcze jedno...otoz w skrypcie ktory tworze mam okreslone rozmiary miniaturki, wersji sredniej oraz największej (pisze to, bo może to w czymś pomóc winksmiley.jpg )

Niedokońca rozumiem działanie tego skryptu ale wygląa na to, żę nie ustala on określonej szerokości lub wysokości (w zależności od tego, co jest większe) miniatury tylko jakoś to tam inaczej sobie oblicza...i przez to miniatura wygląda tak, że mam czarny kwadrat a na nim wyśrodkowana miniatura tongue.gif czy niedalo by sie zmodyfikować skryptu tak, aby miniatura była jakiejś określonej wielkości a obrazek wpasowany w nią ? (przez 'miniature' rozumiem to co generuje skrypt a przez 'obrazek' pomniejszoną wersje oryginalnej grafiki)

no dobra znalazłem ten topic :

http://forum.php.pl/index.php?showtopic=34169

i on powinien rozwiązać mój problem...coprawda wywala jakiś błąd ale skoro innym działa to mi też powinien ;P

pozdrawiam i dzięki za pomoc
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.