ugrás a tartalomhoz

PHP kép átméretező

fabian.attila · 2013. Ápr. 12. (P), 17.41
Sziasztok!
Nemrég egy hasonló című témát indítottam, de ott annyira más irányba kanyarodott a téma, hogy inkább nyitok egy újat, mert ebben már nem csupán elmélkedéssel próbálkozok, hanem valami gyakorlattal is, ámbár nem akar működni, sokat olvasgattam PHP.net-en és vbence produktumát is átnéztem, de nem sikerült sajnos összehozni...

Jelenleg így állok, de nem igazán működik a dolog:
  1. <?php  
  2.   
  3.     $fajl = $_FILES['kep'];  
  4.     $meret = getimagesize($fajl);  
  5.     $magassag = $meret[1];  
  6.     $szelesseg = $meret[0];  
  7.     $uj_szelesseg = $_POST['uj_szelesseg'];  
  8.       
  9.     if ($magassag > $szelesseg)  
  10.         {  
  11.             $eredeti_arany = $szelesseg / $magassag;  
  12.               
  13.             $uj_magassag = $eredeti_arany * $uj_szelesseg;  
  14.         }  
  15.       
  16.     if ($magassag < $szelesseg)  
  17.         {  
  18.             $eredeti_arany = $magassag / $szelesseg;  
  19.               
  20.             $uj_magassag = $eredeti_arany * $uj_szelesseg;  
  21.         }  
  22.           
  23.     if ($magassag == $szelesseg)  
  24.         {             
  25.             $uj_magassag = $uj_szelesseg;  
  26.         }  
  27.           
  28.     header('Content-Type: image/jpeg');  
  29.   
  30.     $kep_alap = imagecreatetruecolor($uj_szelesseg$uj_magassag);  
  31.     $kep = imagecreatefromjpeg($_FILES['kep']);  
  32.     imagecopyresampled($kep_alap$kep, 0, 0, 0, 0, $uj_szelesseg$uj_magassag$szelesseg$magassag);  
  33.   
  34.     $mentes = '../../fooldal/' . $_FILES['kep']['name'];  
  35.       
  36.     imagejpeg($kep_alap$mentes , 100);  
  37.       
  38.     echo "Elmentve!"  
  39.   
  40. ?>  
Valakinek esetleg van ötlete rá?
Előre is köszönöm, további szép napot mindenkinek!

Szerkesztés: Azt hiszem a bővebb leírás elmaradt: mikor elküldöm a formot, az meghívja ezt a fájlt, de a mentés nem igazán történik meg, a fájl eredményeként nem az "Elmentve!" felirat jelenik meg, hanem egy képfájl.

Mialatt ezt leírtam rájöttem, hogy a header ez esetben nem szükséges, majd eltávolítás után kaptam egy pár hibaüzenetet...

A hibaüzeneteknek valószínűleg az $_FILES['kep']-szel van bajuk, de fogalmam sincs mi lehet a megoldás...
 
1

imagejpeg

Hidvégi Gábor · 2013. Ápr. 12. (P), 18.14
nem az "Elmentve!" felirat jelenik meg, hanem egy képfájl
Mit mond a dokumentáció?

A hibaüzeneteknek valószínűleg az $_FILES['kep']-szel van bajuk
Ajánlom figyelmedbe a linkelt cikk utolsó bekezdésében lévő felsorolást.
2

Hibaüzi?

Pepita · 2013. Ápr. 12. (P), 19.41
Lehet, hogy Gábor is erre hivatkozik (cikkében), de kellenének a kiírt hibaüzik is, illetve szövegesen hozzá, hogy pl "ez az xy. sor kezdődik úgy hogy $kep = ". (Szerk.: megnéztem, Gábor is erre (is) utal, de fontos, hogy mi is tudjuk, melyik az a sor.)

Megjegyzem, hogy azt a feltételt nem kezeled, mikor a ($magassag == $szelesseg), vagyis négyzet alakú a kép. Jobb lenne az első feltétel után else ágban folytatni.

Szerk2.: Figyelmetlen voltam! Máris látom, hogy egy nagyot tévedtem, később - regenerálódás után - újra megnézem, nem akarok (több) hülyeséget írni.
3

Elérési út

Poetro · 2013. Ápr. 12. (P), 20.34
Az feltöltött kének nem jól adod meg az elérési útját. Ez ugyanúgy megtalálható a $_FILES tömbben. Azaz neked a $_FILES['kep']['tmp_name'] fog kelleni, de bővebb információért olvasd el a fenti, illetve a $_FILES tömbbel foglalkozó dokumentációt.
4

Segítségetekkel átalakítván a

fabian.attila · 2013. Ápr. 18. (Cs), 15.18
Segítségetekkel átalakítván a programot a következő született:
  1. <?php  
  2.   
  3.     $fajl = $_FILES['kep']['tmp_name'];  
  4.     list($szelesseg$magassag) = getimagesize($fajl);  
  5.     $uj_szelesseg = 200; //$_POST['uj_szelesseg'];  
  6.       
  7.     if ($magassag > $szelesseg)  
  8.         {  
  9.             $eredeti_arany = $szelesseg / $magassag;  
  10.               
  11.             $uj_magassag = $eredeti_arany * $uj_szelesseg;  
  12.         }  
  13.       
  14.     if ($magassag < $szelesseg)  
  15.         {  
  16.             $eredeti_arany = $magassag / $szelesseg;  
  17.               
  18.             $uj_magassag = $eredeti_arany * $uj_szelesseg;  
  19.         }  
  20.           
  21.     if ($magassag == $szelesseg)  
  22.         {             
  23.             $uj_magassag = $uj_szelesseg;  
  24.         }  
  25.   
  26.     $kep_alap = imagecreatetruecolor($uj_szelesseg$uj_magassag);  
  27.     $kep = imagecreatefromjpeg($_FILES['kep']['tmp_name']);  
  28.     imagecopyresampled($kep_alap$kep, 0, 0, 0, 0, $uj_szelesseg$uj_magassag$szelesseg$magassag);  
  29.   
  30.     $mentes = '../../kepek/fooldal/' . $_FILES['kep']['name'];  
  31.       
  32.     imagejpeg($kep_alap$mentes, 100);  
  33.       
  34.     echo "Elmentve!"  
  35.   
  36. ?>  
A program lefutása után a következő üzeneteket kaptam:

Notice: getimagesize() [function.getimagesize]: Read error! in C:\elérési_út\kepfeltoltes_fooldal.php on line 4

(Az én gondoltatom szerint most a probléma az, hogy a TMP fájl, nem képfájl és ezért nem kaphatjuk meg a méretét, de semmi ötletem nincs a megoldásra...)

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG library reports unrecoverable error: in C:\elérési_út\kepfeltoltes_fooldal.php on line 27

(sejtelmem szerint ez szintén a TMP miatt van)

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: 'C:\elérési_út\phpF7C2.tmp' is not a valid JPEG file in C:\elérési_út\kepfeltoltes_fooldal.php on line 27

(ez szintén)

Warning: imagecopyresampled() expects parameter 2 to be resource, boolean given in C:\elérési_út\kepfeltoltes_fooldal.php on line 28

(ez pedig amiatt, hogy nem kapott értéket az $kep változó)

Utolsó önálló nekifutásként próbáltam keresni valami kész kis egyszerű scriptet, de nem találtam semmi hasznosat, amiből meg lehetne tanulni, hogy hogyan is történjen a dolog.

Valakinek van valami ötlete?
5

Írasd ki

Pepita · 2013. Ápr. 18. (Cs), 21.39
Az elsőnél: írasd ki a feltöltött fájl nevét! $_FILES['kep']['tmp_name'] Ellenőrizd, hogy jó képet töltöttél-e fel, feltöltődött-e, ill. a PHP hozzáfér-e? (Nem írásvédett, stb. a könyvtár.)

2-3: Elképzelhető, hogy a .jpg kiterjesztés nem tetszik neki? Próbáld ki, hogy első (nulladik) lépésként átmozgatod a fájlt a honlapod egyik könyvtárába (.jpg kiterjesztéssel), majd ezen végzed a módosításokat. (Amikor én csináltam ilyesmit, akkor így tettem.) Én csodálkozom a kiterjesztésen.

4: Pontosabban: a $kep = false értéket kapta, mert nem valódi jpeg képből próbáltad kreálni.

Úgy tudod leginkább megtanulni, ha kiszenveded legalább egyszer, hogy megírd. Másképp csak "nyomkodni fogod a gombokat" egy nyílt kódon, de nem fogod tudni, hogy mit csinálsz. Ez itt most amúgyis inkább fájlfeltöltési és fájlkezelési gond, azt (is) kéne előbb rendbetenni.

Szerk.: az ideiglenes fájlt a végén illik törölni. Nézd át a Manual fájlfeltöltéssel foglalkozó részét.