"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

[PHP] Problem beim Thumbnail erstellen

tomstig 30.07.2005 - 01:04 2226 24
Posts

tomstig

OC Addicted
Avatar
Registered: Nov 2003
Location: /home/tomstig/
Posts: 1341
Irgendwie will das nicht:

Code: PHP
<?php
error_reporting(E_ALL);

if ($handle = opendir('pics')) {
	
   $i = 0;
   while(false !== ($file = readdir($handle))){  	
   	
	if( $file != "." && $file != ".." ){		
		$info = getimagesize('./pics/' . $file);
	   	if( $info['mime'] == 'image/jpeg' ){	 	   		
			$breitalt = $info[0];
			$hochalt = $info[1];
			$breit = 100;
			$hoch = ceil($hochalt*$breit/$breitalt);
			
			if( $breitalt > $breit ){	
				$bildalt = imagecreatefromjpeg('./pics/' . $file);								
				$bildneu = imagecreate($breit , $hoch);				
				imagecopyresized($bildneu , $bildalt , 0 , 0 , 0 , 0 , $breit , $hoch , $breitalt , $hochalt);
				header("Content-Type: image/jpeg");
				imagejpeg($bildneu);
				imagedestroy($bildalt);
				imagedestroy($bildneu);		
			}	
			       		      
		}else{
	       		echo '<a href="./pics/' . $file . '" alt="">' . $file . '</a>';
		}
		$i++; 		
	}
	
	#if( $i % 5 == 0 )
       		echo '<br />';       	
   }

   closedir($handle);
}
?>

Fehlermeldung: The image “http://localhost/www/gallery/readdir.php” cannot be displayed, because it contains errors.


Hingegen das funktioniert:
Code: PHP
<?php
error_reporting(E_ALL); 

$breit = 100;

$quellbild = './pics/katze.jpg';
$info = getimagesize($quellbild);
$breitalt = $info[0];
$hochalt = $info[1];
$hoch = ceil($hochalt*$breit/$breitalt);

	if( $breitalt > 100 ){
	
	$bildalt = imagecreatefromjpeg($quellbild);
	$bildneu = imagecreate($breit , $hoch);
	
	imagecopyresized($bildneu , $bildalt , 0 , 0 , 0 , 0 , $breit , $hoch , $breitalt , $hochalt);
	
	header("Content-Type: image/jpeg");
	imagejpeg($bildneu);
	imagedestroy($bildalt);
	imagedestroy($bildneu);

}
?>

=> Die Schleife wird dran schuld sein....
Wie gehört es richtig?

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zwei dinge:
Einerseits solltest du dir den Ablauf eines Seitenaufbau's einer Homepage klarmachen.
Andererseits wäre es praktisch, würdest du deinen Code so formatieren, dass man nicht beim lesen schon durcheinander kommt.

Achja, und noch... Kommentare... Ich denke wenn du dir Kommentare reinschreibst, die visualisieren was du machen willst, wirst du auch gleich erkennen wo du den Denkfehler untergebracht hast.

BTW: Die Schleife an sich ist nicht Schuld...

tomstig

OC Addicted
Avatar
Registered: Nov 2003
Location: /home/tomstig/
Posts: 1341
Code: PHP
<?php
error_reporting(E_ALL);


if ($handle = opendir('pics')) {
	
   $i = 0;
   # Schleife, die alle Dateien in dem Ordner durchgeht
   while(false !== ($file = readdir($handle))){  	
   	   	
	if( $file != "." && $file != ".." ){
		# informationen von dem bild werden eingeholt
		$info = getimagesize('./pics/' . $file);
		
		# wenn das bild ein jpg ist, soll es verkleinert werden
	   	if( $info['mime'] == 'image/jpeg' ){ 	   		
			$breitalt = $info[0];					# derzeitige breite
			$hochalt = $info[1];					# derzeitige höhe
			$breit = 100;						# gewünschte neue breite
			$hoch = ceil($hochalt*$breit/$breitalt);		# gewünschte neue höhe wird im verhältnis zur gewünschten breite ausgerechnet
			
			if( $breitalt > $breit ){				# wenn das bild schon kleiner als die gewünschte breite ist, braucht es nicht verändert werden
				$bildalt = imagecreatefromjpeg('./pics/' . $file);	# bild mit den originalen größen wird erzeugt								
				$bildneu = imagecreate($breit , $hoch);			# ein neues leeres bild mit den neuen höhen wird erstellt			
				imagecopyresized($bildneu , $bildalt , 0 , 0 , 0 , 0 , $breit , $hoch , $breitalt , $hochalt);		# bild mit neuen größen wird in $bildneu gespeichert
				header("Content-Type: image/jpeg");			# browser wird auf ein jpeg "vorbereitet" 
				imagejpeg($bildneu);					# bild wird ausgegeben
				imagedestroy($bildalt);					
				imagedestroy($bildneu);		
			}	
		# wenn das bild kein jpg ist, soll es einfach nur mit link anklickbar sein (wird hier nur testweise so gemacht)
		}else{
	       		echo '<a href="./pics/' . $file . '" alt="">' . $file . '</a>';
		}
		$i++; 		
	}
	
	#if( $i % 5 == 0 )
       		echo '<br />';       	
   }

   closedir($handle);
}
?> 

und jetzt?

dio

Here to stay
Registered: Nov 2002
Location: Graz
Posts: 4885
Damit ich das richtig versteh: Du willst

Code: PHP
if( $file != "." && $file != ".." ){ 
.
.
.
}else{
                   echo '<a href="./pics/' . $file . '" alt="">' . $file . '</a>';
        } 
das wirklich so haben?

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Ich hab das hier nur (zumindest für mich) lesbarer gestaltet...
Code: PHP
<?php
error_reporting(E_ALL);


if ($handle = opendir('pics')) {
	$i = 0;
	# Schleife, die alle Dateien in dem Ordner durchgeht
	while(false !== ($file = readdir($handle))){  	
		if( $file != "." && $file != ".." ){
			# informationen von dem bild werden eingeholt
			$info = getimagesize('./pics/' . $file);
		
			# wenn das bild ein jpg ist, soll es verkleinert werden
			if( $info['mime'] == 'image/jpeg' ){
				# derzeitige breite
				$breitalt = $info[0];
				# derzeitige höhe
				$hochalt = $info[1];
				# gewünschte neue breite
				$breit = 100;
				# gewünschte neue höhe wird im verhältnis zur gewünschten breite ausgerechnet
				$hoch = ceil($hochalt*$breit/$breitalt);
			
				# wenn das bild schon kleiner als die gewünschte breite ist, braucht es nicht verändert werden
				if( $breitalt > $breit ){
					# bild mit den originalen größen wird erzeugt
					$bildalt = imagecreatefromjpeg('./pics/' . $file);
					# ein neues leeres bild mit den neuen höhen wird erstellt
					$bildneu = imagecreate($breit , $hoch);
					# bild mit neuen größen wird in $bildneu gespeichert
					imagecopyresized($bildneu , $bildalt , 0 , 0 , 0 , 0 , $breit , $hoch , $breitalt , $hochalt);
					# browser wird auf ein jpeg "vorbereitet" 
					header("Content-Type: image/jpeg");
					# bild wird ausgegeben
					imagejpeg($bildneu);
					imagedestroy($bildalt);
					imagedestroy($bildneu);
				}
			# wenn das bild kein jpg ist, soll es einfach nur mit link anklickbar sein (wird hier nur testweise so gemacht)
			}else{
				echo '<a href="./pics/' . $file . '" alt="">' . $file . '</a>';
			}
			$i++; 		
		}
		#if( $i % 5 == 0 )
			echo '<br />';
	}
	closedir($handle);
}
?>
Ja, dio hat's schon angedeutet...
Ich dachte du merkst es selbst - du willst Bilder direkt in den HTML-Code ausgeben. das geht schlichtweg (oder zumindest so wie du es machst - und in den meisten Browsern) nicht, du kannst nur links zu Bildern ausgeben

Wenn du ein Bild resizen willst und dann ausgeben darf das nur der absolut einzige Content sein den du ausgibst - nur das Bild, sonst nichts. Wenn du ne Fehlermeldung hast, zerstört die das Bild - Genauso jede andere Ausgabe (per echo, print,...). Der richtige Header fehlt in deinem Fall auch noch.

tomstig

OC Addicted
Avatar
Registered: Nov 2003
Location: /home/tomstig/
Posts: 1341
Zitat von watchout
Wenn du ein Bild resizen willst und dann ausgeben darf das nur der absolut einzige Content sein den du ausgibst - nur das Bild, sonst nichts. Wenn du ne Fehlermeldung hast, zerstört die das Bild - Genauso jede andere Ausgabe (per echo, print,...). Der richtige Header fehlt in deinem Fall auch noch.

Sowas in der Art hab ich mir schon gedacht, nur wie funktionieren dann alle Galerien mit Thumbnails?

dio

Here to stay
Registered: Nov 2002
Location: Graz
Posts: 4885
Ich versteh zwar deine Frage nicht richtig, aber:
Code: PHP
<img src="bildscript.php?id=123">

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14595
Zitat von tomstig
Sowas in der Art hab ich mir schon gedacht, nur wie funktionieren dann alle Galerien mit Thumbnails?
genauso wie es dio schon gesagt hat!

Du musst aber dazu (wie oben schon gesagt wurde) ALLE "textmeldungen" rausgeben. da darf NIX anders sein. keine ausgabe, NUR das bild. oder du bekommst den fehler, den du geschrieben hast.

kommentier mal bitte alle "ausgaben" aus und versuchs nochmal. Sollte dann gehen.

tomstig

OC Addicted
Avatar
Registered: Nov 2003
Location: /home/tomstig/
Posts: 1341
Das ist das also nicht möglich...

Egal, dann bau ich halt ein Script, dass alle Bilder durchgeht, sie verkleinert, und speichert... wird am einfachsten gehen...

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
was ist nicht möglich? Ich versteh dein Problem nicht...

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
ich glaub er meint das direkt ausgeben eines bildes mit php inkl. zusätzlichem senden von text.

Ich persönlich bevorzuge sowieso die speicherung des thumbnails auf dem server ... spart einiges an performancen, finde ich.

tomstig

OC Addicted
Avatar
Registered: Nov 2003
Location: /home/tomstig/
Posts: 1341
Zitat von watchout
was ist nicht möglich? Ich versteh dein Problem nicht...

Dass ich eine ganz normale Seite habe, mit Menü (ACHTUNG: Menü beeinhaltet Text) und im content-Bereich eine Galerie mit Thumbnails von allen Bildern, die in einem Ordner sind.

Ist das möglich?

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von tomstig
Ist das möglich?
klar ist das möglich.

tomstig

OC Addicted
Avatar
Registered: Nov 2003
Location: /home/tomstig/
Posts: 1341
Zitat von watchout
klar ist das möglich.

Deine Antwort hat mich - genau wie die anderen in diesem Thread - um Eckhäuser weitergebracht :rolleyes:

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von tomstig
Deine Antwort hat mich - genau wie die anderen in diesem Thread - um Eckhäuser weitergebracht :rolleyes:
möchtest du Hilfe oder jemanden der dir dein Script schreibt?

Die Sache ist wirklich simpel, man muss nur verstehen wie PHP funktioniert und was PHP macht - das steht auf den ersten Manual-Pages so ausführlich beschrieben, es ist absolut unmöglich das nicht zu verstehen. Du stehst auf der Leitung - das is mir klar, aber ich halte es für sinnlos etwas vorzukauen, dadurch lernt man nichts.
Wenn dir natürlich der Lerneffekt egal ist, kann ich dir ein fertiges Script posten an dem du dir anschaun kannst wie's gemacht wird - warum man das aber so macht wirst du vielleicht richtig vermuten, aber das tiefe Verständnis das für kompliziertere Aufgaben in die Richtung notwendig ist wird sich so nicht einstellen.

Ich kann natürlich einen Anderen nicht davon abhalten dir die Lösung zu präsentieren, es ist aber gegen meine Überzeugung sowas zu tun - deswegen werde *ich* das nicht tun.

Ich hoffe du verstehst mich nicht falsch, ich meins wirklich nicht bös'.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz