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:

<?php

	$fajl = $_FILES['kep'];
	$meret = getimagesize($fajl);
	$magassag = $meret[1];
	$szelesseg = $meret[0];
	$uj_szelesseg = $_POST['uj_szelesseg'];
	
	if ($magassag > $szelesseg)
		{
			$eredeti_arany = $szelesseg / $magassag;
			
			$uj_magassag = $eredeti_arany * $uj_szelesseg;
		}
	
	if ($magassag < $szelesseg)
		{
			$eredeti_arany = $magassag / $szelesseg;
			
			$uj_magassag = $eredeti_arany * $uj_szelesseg;
		}
		
	if ($magassag == $szelesseg)
		{			
			$uj_magassag = $uj_szelesseg;
		}
		
	header('Content-Type: image/jpeg');

	$kep_alap = imagecreatetruecolor($uj_szelesseg, $uj_magassag);
	$kep = imagecreatefromjpeg($_FILES['kep']);
	imagecopyresampled($kep_alap, $kep, 0, 0, 0, 0, $uj_szelesseg, $uj_magassag, $szelesseg, $magassag);

	$mentes = '../../fooldal/' . $_FILES['kep']['name'];
	
	imagejpeg($kep_alap, $mentes , 100);
	
	echo "Elmentve!"

?>
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:

<?php

	$fajl = $_FILES['kep']['tmp_name'];
	list($szelesseg, $magassag) = getimagesize($fajl);
	$uj_szelesseg = 200; //$_POST['uj_szelesseg'];
	
	if ($magassag > $szelesseg)
		{
			$eredeti_arany = $szelesseg / $magassag;
			
			$uj_magassag = $eredeti_arany * $uj_szelesseg;
		}
	
	if ($magassag < $szelesseg)
		{
			$eredeti_arany = $magassag / $szelesseg;
			
			$uj_magassag = $eredeti_arany * $uj_szelesseg;
		}
		
	if ($magassag == $szelesseg)
		{			
			$uj_magassag = $uj_szelesseg;
		}

	$kep_alap = imagecreatetruecolor($uj_szelesseg, $uj_magassag);
	$kep = imagecreatefromjpeg($_FILES['kep']['tmp_name']);
	imagecopyresampled($kep_alap, $kep, 0, 0, 0, 0, $uj_szelesseg, $uj_magassag, $szelesseg, $magassag);

	$mentes = '../../kepek/fooldal/' . $_FILES['kep']['name'];
	
	imagejpeg($kep_alap, $mentes, 100);
	
	echo "Elmentve!"

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