[PHP] +Images + Attrib + Resize

exportforce

Avachangererfinder
ID: 68278
L
23 April 2006
256
22
Wie kann ich SINNVOLL frisch hochgeladene Bilder Sinnvoll auslesen (attribute wie höhe, breite, größe etc.) resizen (z. B. das es in einer bestimmten max. bereich ist)

Also wenn ein Bild z. B. 934x203 ist und man es auf z. B. 100x100 fest resized, sieht es verpeilt aus. Wie kann ich es so resizen das es z. B. in einen Bereich von 200x150 passt. Aber halt nicht fest resized, sondern das beide Werte entweder GLEICH oder Kleiner dem Wert von Höhe*Breite ist?

Hoffe habs halbwegs gut erklärt ^^
 
Ja hab ich auch schon versucht, aber des will irgendwie net...
Ich bin schon auf die Idee gekommen das per file irgendwie auszulesen
 
exportforce schrieb:
Ja hab ich auch schon versucht, aber des will irgendwie net...
Ich bin schon auf die Idee gekommen das per file irgendwie auszulesen

getimagesize

(PHP 3, PHP 4, PHP 5)
getimagesize -- Ermittelt die Ausmaße einer GIF-, JPEG-, PNG- oder SWF-Grafik-Datei
Beschreibung:
array getimagesize ( string filename [, array imageinfo] )

getimagesize sollte es imho afaik sehr wohl tun!

Für das was du willst, musst du wohl das Verhältnis Länge zu Breite beibehalten. Also schaust du am besten erstmal, was die längere Seite ist. Und dann schaust du, wie groß diese maximal sein darf. Wird die Seitenlänge überschritten, muss sie verkleinert werden. Diesen Anteil/ dieses Verhältnis (theoretisch anschaulicher: Prozentsatz) musst du dir merken und für die andere Seite anwenden, damit die Proportionalität der Seitenlängen beibehalten bleibt.

Hope that helps.

165.
 
Meine Idee:
Du berechnest die Diagonale von deinem richtigen Bild.
Wenn du die Breite änderst, dann kannst du damit die neue Höhe bestimmen.

Ist jetzt nur so eine Idee. Du musst jedoch beachten, dass die Diagonale nur ein Vielfaches (ein Teil) von der Originaldiagonale ist.
 
exportforce schrieb:
Ei jo ^^
Aber ich und Mathe o_O
Hm... na gut, ich schreib eben was. Bin heute mal lieb. :ugly: Versuche es anschaulich darzustellen und knalle dann eventuell gleich hier eine Art Tutorial rein in der Hoffnung, dass du es verstehst und es evtl. in FAQ aufgenommen wird.

Kannst mir vielleicht mal ein paar Bilder schicken und gewünschte Größen? Nur als Anschauungsmaterial und zum Experimentieren für das Tutorial? Ansonsten muss ich selber mal schauen.

Edit: btw wird wohl ein Resizen mithilfe der GDLib nötig werden, außer jemand hat einen anderen Vorschlag. Musst dann schauen, wie das mit aktuellem Support von gif-Dateien wäre. Ich bastel mal was mit png + jpeg, etc.!
 
Wenn du irgendein Bild in ein 150x200 px Feld packen willst ohne es zu verzerren, würde ich dir raten, erstmal die Maße des Bildes zu ermitteln.

Dann guckst du, welche die kürzere Seite ist. Die darf, wenn sie oben ist, letztendlich max. 150 px breit sein, wenn sie seitlich liegt (also ein Bild im Querformat), dann darf sie maximal 200px sein.

So resized zu dann das Bild! Wie groß die andere Seite dann sein muss, kannst du ja berechnen. (Meinetwegen mit Prozentrechnung)

Letztendlich schneidest du dann immer etwas ab, was übersteht. Ich hoffe, du verstehst, was ich meine und ich hoffe, ich konnte dir helfen!

-Flori-
 
happymaster schrieb:
Hm... na gut, ich schreib eben was. Bin heute mal lieb. :ugly: Versuche es anschaulich darzustellen und knalle dann eventuell gleich hier eine Art Tutorial rein in der Hoffnung, dass du es verstehst und es evtl. in FAQ aufgenommen wird.

Kannst mir vielleicht mal ein paar Bilder schicken und gewünschte Größen? Nur als Anschauungsmaterial und zum Experimentieren für das Tutorial? Ansonsten muss ich selber mal schauen.

2524.jpg

2518.jpg

2514.jpg


Hab grad nur das parat....
für das Beispiel kann man ja z. B. 300x200 nehmen :)
(Wie gesagt, ist max. kleiner is ok ^^)
thx schonmal
 
Puh... ist doch komplizierter als gedacht und das bei eingefrorenem Gehirn! :mrgreen:
(Oder ich mach's mir atm zu kompliziert.. dauert also noch! ^^)

Edit: okay, hab's gleich! :)
 
Zuletzt bearbeitet:
PHP:
<?

function resize($input_file, $output_file) {
	# happymaster, 2006

	define('MAX_WIDTH', 300);	# maximale Breite
	define('MAX_HEIGHT', 30);	# maximale Höhe
	
	if(file_exists($input_file)) {
		$data = getimagesize($input_file);
		if($data[0] <> 0 && $data[1] <> 0) {
		
			if($data[0] > MAX_WIDTH) {
				# Breite größer
				$width = MAX_WIDTH;
				$height = ($data[1]/$data[0])*$width;
				$c = true;
			}
			
			if($data[1] > MAX_HEIGHT) {
				# Höhe größer
				$height = MAX_HEIGHT;
				$width = ($data[0]/$data[1])*$height;
				$c = true;
			}
			
			if(!$c) {
				$width = $data[0];
				$height = $data[1];
			}
			
			$width = round($width);
			$height = round($height);
			
			if($data[2] == 2) {
				# JPEG
				$im = imagecreatefromjpeg($input_file);
				$new_im = imagecreatetruecolor($width, $height);
				imagecopyresampled($new_im, $im, 0, 0, 0, 0, $width, $height, $data[0], $data[1]);
				imagejpeg($new_im, $output_file);
			}
			elseif($data[2] == 3) {
				# PNG
				$im = imagecreatefrompng($input_file);
				$new_im = imagecreatetruecolor($width, $height);
				imagecopyresampled($new_im, $im, 0, 0, 0, 0, $width, $height, $data[0], $data[1]);
				imagepng($new_im, $output_file);
			}
		
		}
	}
}

resize('php.png', 'neu.png');

?>


Beispiel:
php.png

:arrow:
neu.png
 
Zuletzt bearbeitet:
PHP:
if(!$infos = getimagesize($_FILES['user_pic']['tmp_name'])) return false;
    $w_to_h = $infos[0]/$infos[1];
    $h_to_w = $infos[1]/$infos[0];
    $direction = NULL;
    if($infos[0] < $infos[1])
    {
        $max_height = 270;
        $max_width     = 200;
        $direction = 'v';
    }
    elseif($infos[0] == $infos[1])
    {
        $max_height = 200;
        $max_width  = 200;
        $direction  = 'q';
    }
    else
    {
        $max_height = 200;
        $max_width     = 270;
        $direction  = 'h';
    }
    
    $new_width     = 0;
    $new_height = 0;
    $ext = NULL;
    if($infos[0] > $max_width || $infos[1] > $max_height)
    {        
        
        if($infos[0] > $max_width && $direction == 'h' )
        {
            $new_width  = $max_width;
            $new_height = ceil($max_width*$h_to_w);
        }
        elseif($infos[1] > $max_height && $direction == 'v')
        {
            $new_width  = ceil($max_height*$w_to_h);
            $new_height = $max_height;
        }
        elseif($direction == 'q')
        {
            $new_width  = $max_width;
            $new_height = $max_height;
        }
    }
    else
    {
        $new_width     = $infos[0];
        $new_height = $infos[1];
    }
    switch($infos[2])
    {
            case 1:        $ext = ".gif";
                        $source_pic = imagecreatefromgif($_FILES['user_pic']['tmp_name']);
                        break;
            case 2:        $ext = ".jpg";
                        $source_pic = imagecreatefromjpeg($_FILES['user_pic']['tmp_name']);
                        break;
            case 3:        $ext = ".png";
                        $source_pic = imagecreatefrompng($_FILES['user_pic']['tmp_name']);
                        break;
    }
$pic = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($pic, $source_pic, 0, 0, 0, 0, $new_width, $new_height, $infos[0], $infos[1]);
nur mal so als Beispiel

Edit: ... mh war wieder zu langsam
 
happymaster schrieb:
PHP:
<?

function resize($input_file, $output_file) {
	# happymaster, 2006

	define('MAX_WIDTH', 300);	# maximale Breite
	define('MAX_HEIGHT', 30);	# maximale Höhe
	
	if(file_exists($input_file)) {
		$data = getimagesize($input_file);
		if($data[0] <> 0 && $data[1] <> 0) {
		
			if($data[0] > MAX_WIDTH) {
				# Breite größer
				$width = MAX_WIDTH;
				$height = ($data[1]/$data[0])*$width;
			}
			
			if($data[1] > MAX_HEIGHT) {
				# Höhe größer
				$height = MAX_HEIGHT;
				$width = ($data[0]/$data[1])*$height;
			}
			
			$width = round($width);
			$height = round($height);
			
			if($data[2] == 2) {
				# JPEG
				$im = imagecreatefromjpeg($input_file);
				$new_im = imagecreatetruecolor($width, $height);
				imagecopyresampled($new_im, $im, 0, 0, 0, 0, $width, $height, $data[0], $data[1]);
				imagejpeg($new_im, $output_file);
			}
			elseif($data[2] == 3) {
				# PNG
				$im = imagecreatefrompng($input_file);
				$new_im = imagecreatetruecolor($width, $height);
				imagecopyresampled($new_im, $im, 0, 0, 0, 0, $width, $height, $data[0], $data[1]);
				imagepng($new_im, $output_file);
			}
		
		}
	}
}

resize('php.png', 'neu.png');

?>


Beispiel:
php.png

:arrow:
neu.png
Wenn ich das richtig sehe, ist "$outputfile" ne neue FESTE Datei? ^^
Wenn ja, perfekt :)
 
exportforce schrieb:
Wenn ich das richtig sehe, ist "$outputfile" ne neue FESTE Datei? ^^
Wenn ja, perfekt :)
Joa.. "fest"? Das entstandene Bild wird halt in der $output_file-Datei gespeichert. Hab's mal so gemacht, ist recht nützlich so. Liese sich natürlich auch nur durch das Anzeigen machen. Dann muss aber der Header ausgegeben werden:
PHP:
header("Content-type:  ".$data['mime']);
Und $output_file unten raus.

Edit: hab jetzt noch was angepasst.. klamm wollte gestern Nacht ja nicht mehr.

PHP:
			if($data[0] > MAX_WIDTH) {
				# Breite größer
				$width = MAX_WIDTH;
				$height = ($data[1]/$data[0])*$width;
				$c = true;
			}
			
			if($data[1] > MAX_HEIGHT) {
				# Höhe größer
				$height = MAX_HEIGHT;
				$width = ($data[0]/$data[1])*$height;
				$c = true;
			}
			
			if(!$c) {
				$width = $data[0];
				$height = $data[1];
			}

Könnte sonst Probleme geben mit Bildern, die passen...
 
Zuletzt bearbeitet:
Hm also hab jetzt mal rumprobiert...
Aber entweder bin ich zu blöd (und nein ich will jetzt keine Bestätigung ^^) oder k/A. Ich krich das neue erstellte Bild nicht gespeichert. Also das es aufm Server residiert :-/
 
exportforce schrieb:
Hm also hab jetzt mal rumprobiert...
Aber entweder bin ich zu blöd (und nein ich will jetzt keine Bestätigung ^^) oder k/A. Ich krich das neue erstellte Bild nicht gespeichert. Also das es aufm Server residiert :-/

Kann sein, dass die Rechte fehlen. Musst mal schauen (@CHMOD). Ansonsten musst du schauen, ob das Skript auch wirklich funzt. Gibt auch noch paar Beispiele im Manual, wie ich feststellen durfte.. ansonsten gibt's solche Skripte besitmmt en masse in komischen Tutorials und Skriptseiten.
 
Alternativ empfehle ich die Verwendung von ImageMagick. Das ist auf jedem gescheiten Webhosting-Paket installiert und sehr einfach in der Benutzung:
PHP:
exec('convert -thumbnail 200x150 "alt.jpg" "neu.jpg"');
(macht aus alt.jpg ein Thumbnail neu.jpg mit maximal 200x150)

Gruß,
Xgame