| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

17-09-2009, 08:57
|
|
Agassiz
Registrierter Benutzer
|
|
Registriert seit: Sep 2009
Beiträge: 6
|
|
Einfache Thumbnails erzeugen Problem
Hi, ich habe eine index.php wo ich in einen div container eine gallery.php include.
In dieser gallery.php sollen alle gefundenen Bilder in einem Ordner als Thumbnails dargestellt werden.
Allerdings habe ich nun das Problem mit dem header ( Cannot modify header information - headers already sent by.... )
Und ich weis nicht wie ich das umgehen kann.
Hier im Forum wurd iwo gesagt, dass vor der header-information kein html code kommen darf der vom browser dargestellt wird.
Aber das Problem kann ich eigentlich gar nicht umgehen, weil ich die gallery ja include.
meine gallery.php sieht folgendermaßen aus (ich wollte erstmal ein bild aus dem ordner ausprobieren bevor ich das in ner schleife mache
denn unten weiter werden die links der bilder ausgegeben, was auch gut funktioniert. )
PHP-Code:
<?php
$img="Backg.jpg"; $percent = 0.4; header('Content-type: image/jpeg'); list($width, $height) = getimagesize($img); $newwidth = $width * $percent; $newheight = $height * $percent; $thumb = imagecreatetruecolor($newwidth, $newheight); $source = imagecreatefromjpeg($img); imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); imagejpeg($thumb);
echo " <div align=\"left\"id=\"ausgabe\"> "; echo "<a href=\"../\">Parent Directory</a>"; printf('<br><br><br><br>');
foreach (glob("./owngallery/*.*") as $file) { $size = filesize("$file"); $readsize = ($size / 1024)/1024 ; $sizename = "MB";
if ($readsize < 1){ $readsize = $readsize * 1024; $sizename = "kB"; } $readsize = round($readsize, 2); if (is_dir($file)){ //nix machen //printf('<li><b><a href="%s/"><font size="2">%s (%.2f %s)</font></b><br></a></li>', $file, $file, $readsize, $sizename ); } else if ($file != "./owngallery/gallery.php"){ printf('<img src="%s">',$file); printf('<li><b><a href="%s"><font size="2">%s (%.2f %s)</font></b><br></a></li>', $file, $file, $readsize, $sizename ); }
} echo "</div>"; ?>
Wie kann ich das "HeaderProblem" lösen?
|

17-09-2009, 12:15
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo,
imagejpeg gibt den Thumbnail aus, schiebt also die Binärdaten des Bildes zum Browser. Wie kommst du auf die Idee, binäre Bilddaten direkt ins HTML zu schreiben? Das kann doch gar nicht funktionieren.
a.) Du kannst das Bild mittels dem 2. Parameter von imagejpeg speichern und aus dem Dateinamen das src-Attribut für ein entsprechendes img-Element gewinnen.
b.) Du kannst ein img-Element einbauen, dessen src-Attribut auf ein bilderzeugendes PHP-Skript verweist.
Gruß,
Amica
Geändert von AmicaNoctis (17-09-2009 um 12:17 Uhr)
|

17-09-2009, 20:05
|
|
Agassiz
Registrierter Benutzer
|
|
Registriert seit: Sep 2009
Beiträge: 6
|
|
ah danke..
habe jetz den header kram ganz weggelassen und nun klappts
|

17-09-2009, 20:08
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von Agassiz
ah danke..
habe jetz den header kram ganz weggelassen und nun klappts 
|
Nur davon dürfte es eigentlich nicht klappen. Wie hast du es jetzt gemacht: a.) oder b.)?
Amica
|

17-09-2009, 23:04
|
|
Agassiz
Registrierter Benutzer
|
|
Registriert seit: Sep 2009
Beiträge: 6
|
|
hab variante a) genommen.
der code is relativ konfus, aber da ich anfänger bin geht das wohl klar denk ich
ich lasse jetzt alle jpg und png dateien als thumbnail anzeigen wenn sie
höher als 400px UND/Oder breiter als 600px sind, diese sind dann auch schon "automatisch" verlinkt zum vergrößern.
als nächstes schau ich mir mal an, wie ich die transparenz von png files erhalte beim umformen.
oder ich schneide nur quadrate aus den zu großen bildern und nehme diese als thumbnails , dann sieht das auch schöner aus... dann vll noch in eine tabelle und denn passts...
gaaaanz später dann vielleicht sogar mit seitenanzeige ( also # Bilder pro seite anzeigen ) - aber davon hab ich noch rein gar keinen plan...
vielleicht mit ner sql datenbank - nen gästebuch mit adminbereich hab ich schon selbst gecodet (php+mysql)  ^^ *stolzsei
aber hier mein code der gallery datei:
PHP-Code:
<?php
echo "<div id=\"gallerybla\" align=\"center\"> ";
echo " <div align=\"left\"id=\"ausgabe\"> "; echo "<br><b>Meine eigene Gallerie :D </b><br><br><br>";
foreach (glob("./owngallery/*.*") as $file) { $orig_file = $file; $size = filesize("$file"); $readsize = ($size / 1024)/1024 ; $sizename = "MB"; if ($readsize < 1){ $readsize = $readsize * 1024; $sizename = "kB"; } $readsize = round($readsize, 2);
if (is_dir($orig_file)){ } else if ($orig_file != "./owngallery/gallery.php"){ if (strpos($orig_file,".jpg")!=null){ list($width, $height) = getimagesize($orig_file); if (($width < 600) && ($height < 400)){ leave_jpg($orig_file); } else { create_jpg_thumbnail($orig_file); } } if (strpos($orig_file,".png")!=null) { list($width, $height) = getimagesize($orig_file); if (($width < 600) && ($height < 400)){ leave_png($orig_file); } else { create_png_thumbnail($orig_file); } } }
} echo "</div>"; echo "</div>"; function create_jpg_thumbnail($orig_file){ $file = $orig_file; $img = $file; $percent = 0.2; list($width, $height) = getimagesize($img); $newwidth = $width * $percent; $newheight = $height * $percent; $thumb = imagecreatetruecolor($newwidth, $newheight); $source = imagecreatefromjpeg($img); imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); $newfile = str_replace("./owngallery/", "thumb_", $file); imagejpeg($thumb, $newfile); printf('<a href="%s"><img src="%s"></a><br><br><br>',$file,$newfile); } function create_png_thumbnail($orig_file){ $file = $orig_file; $img = $file; $percent = 0.2; list($width, $height) = getimagesize($img); $newwidth = $width * $percent; $newheight = $height * $percent; $thumb = imagecreatetruecolor($newwidth, $newheight); $source = imagecreatefrompng($img); imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); $newfile = str_replace("./owngallery/", "thumb_", $file); imagepng($thumb, $newfile); printf('<a href="%s"><img src="%s"></a><br><br><br>',$file,$newfile); } function leave_jpg($orig_file){ $file = $orig_file; list($width, $height) = getimagesize($file); $thumb = imagecreatetruecolor($width, $height); $source = imagecreatefromjpg($img); imagecopyresized($thumb, $source, 0, 0, 0, 0, $width, $height, $width, $height); $newfile = str_replace("./owngallery/", "thumb_", $file); imagejpg($thumb, $newfile); printf('<a href="%s"><img src="%s"></a><br><br><br>',$file,$newfile); }
function leave_png($orig_file){ $file = $orig_file; list($width, $height) = getimagesize($file); $thumb = imagecreatetruecolor($width, $height); $source = imagecreatefrompng($file); imagecopyresized($thumb, $source, 0, 0, 0, 0, $width, $height, $width, $height); $newfile = str_replace("./owngallery/", "thumb_", $file); imagepng($thumb, $newfile); printf('<a href="%s"><img src="%s"></a><br><br><br>',$file,$newfile); } ?>
|

17-09-2009, 23:14
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Noch ein Tipp: nimm imagecopyresampled statt imagecopyresized.
Was die Transparenz angeht: imagealphablending und imagesavealpha auf true setzen.
Gruß,
Amica
|

18-09-2009, 14:39
|
|
Agassiz
Registrierter Benutzer
|
|
Registriert seit: Sep 2009
Beiträge: 6
|
|
jetz bekomme ich einen weiteren fehler beim umformen
und zwar:
" Fatal error: Allowed memory size of 25165824 bytes exhausted "
aber ich habe lediglich 4 Bilder die jeweils so 1,5MB groß sind.
aber mein erlaubter speicher ist doch 24MB ( wie es oben steht )
Muss ich eine maximale Auflösung einstellen beim Upload? Denn es gibt ja auch 500kb files die >2MB groß sind.
|

18-09-2009, 14:51
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Benutzt du zwischendurch imagedestroy? Wenn nicht, wäre das sehr zu empfehlen.
|

18-09-2009, 15:01
|
|
Agassiz
Registrierter Benutzer
|
|
Registriert seit: Sep 2009
Beiträge: 6
|
|
hatte ich nicht gemacht, aber nachträglich hinzugefügt aber das problem besteht weiterhin..
schon komisch.. muss jetz mal schauen dass ich ne max. auflösung finde oder sowas...
hier mein aktueller code:
PHP-Code:
<?php
echo "<div id=\"gallerybla\" align=\"center\"> ";
echo " <div align=\"left\"id=\"ausgabe\"> "; echo "<br><b>Meine eigene Gallerie :D </b><br><br><br>";
foreach (glob("./owngallery/*.*") as $file) { $orig_file = $file; $size = filesize("$file"); $readsize = ($size / 1024)/1024 ; $sizename = "MB"; if ($readsize < 1){ $readsize = $readsize * 1024; $sizename = "kB"; } $readsize = round($readsize, 2); if (is_dir($orig_file)){ } else if ($orig_file != "./owngallery/gallery.php"){ if ((strpos($orig_file,".jpg")!=null) || (strpos($orig_file,".JPG")!=null)){ list($width, $height) = getimagesize($orig_file); if (($width < 600) && ($height < 400)){ leave_jpg($orig_file); } else { create_jpg_thumbnail($orig_file); } } if (strpos($orig_file,".png")!=null) { list($width, $height) = getimagesize($orig_file); if (($width < 600) && ($height < 400)){ leave_png($orig_file); } else { create_png_thumbnail($orig_file); } } } } echo "</div>"; echo "</div>"; function create_jpg_thumbnail($orig_file){ $file = $orig_file; $img = $file; $percent = 0.2; list($width, $height) = getimagesize($img); $src_posx = ($width /3) - 50 ; $src_posy = ($height /3) - 50 ; $newwidth = 150; // $width * $percent; $newheight = 150; //$height * $percent; $thumb = imagecreatetruecolor($newwidth, $newheight); $source = imagecreatefromjpeg($img); imagecopyresampled($thumb, $source, 0, 0, $src_posx, $src_posy, $newwidth, $newheight, $newwidth, $newheight); $newfile = str_replace("./owngallery/", "thumb_", $file); imagejpeg($thumb, $newfile); printf('<a href="%s"><img src="%s"></a><br><br><br>',$file,$newfile); imagedestroy($source); imagedestroy($thumb); } function create_png_thumbnail($orig_file){ $file = $orig_file; $img = $file; $percent = 0.2; list($width, $height) = getimagesize($img); $newwidth = $width * $percent; $newheight = $height * $percent; $thumb = imagecreatetruecolor($newwidth, $newheight); $source = imagecreatefrompng($img); imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); $newfile = str_replace("./owngallery/", "thumb_", $file); imagepng($thumb, $newfile); printf('<a href="%s"><img src="%s"></a><br><br><br>',$file,$newfile); imagedestroy($source); imagedestroy($thumb); } function leave_jpg($orig_file){ $file = $orig_file; list($width, $height) = getimagesize($file); $source = imagecreatefromjpg($img); $newfile = str_replace("./owngallery/", "thumb_", $file); imagejpg($source, $newfile); printf('<a href="%s"><img src="%s"></a><br><br><br>',$file,$newfile); imagedestroy($source); imagedestroy($thumb); }
function leave_png($orig_file){ $file = $orig_file; list($width, $height) = getimagesize($file); $thumb = imagecreatetruecolor($width, $height); $source = imagecreatefrompng($file); imagealphablending($source, true); imagesavealpha($source, true); $newfile = str_replace("./owngallery/", "thumb_", $file); imagepng($source, $newfile); printf('<a href="%s"><img src="%s"></a><br><br><br>',$file,$newfile); imagedestroy($source); imagedestroy($thumb); } ?>
|

18-09-2009, 15:35
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von Agassiz
" Fatal error: Allowed memory size of 25165824 bytes exhausted "
aber ich habe lediglich 4 Bilder die jeweils so 1,5MB groß sind.
aber mein erlaubter speicher ist doch 24MB ( wie es oben steht )
Muss ich eine maximale Auflösung einstellen beim Upload? Denn es gibt ja auch 500kb files die >2MB groß sind.
|
*seufz*
Die Dateigrösse eines Bildes ist wenig interessant - denn in der Datei befinden sich komprimierte Daten.
Um das Bild bearbeiten zu können, muss es aber entpackt werden - und dann belegt es bei true color Höhe mal Breite mal 3 Byte Platz im Hauptspeicher ...
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

18-09-2009, 15:42
|
|
PHP-Desaster
PHP Expert
|
|
Registriert seit: Mar 2006
Beiträge: 3.104
|
|
Zitat:
Zitat von wahsaga
und dann belegt es bei true color Höhe mal Breite mal 3 Byte Platz im Hauptspeicher ...
|
Mit der GD (leider) sogar noch um einiges mehr. Der combie hat da mal was zu geschrieben.
|

19-09-2009, 12:32
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von PHP-Desaster
|
Das Problem ist nicht die GD-Library. Deren Speicherverbrauch lässt sich ziemlich[1] genau berechnen:
* Bei TrueColour-Bitmaps sind das eine Image-Header-Struktur, ein Array von Zeigern auf die Bildzeilen und schließlich der Speicherplatz für die Zeilen selbst (4 Bytes pro ARGB-Pixel).
* Im Paletten-Modus gibts eine geänderte Image-Header-Struktur, darin eingebettet die 256 Einträge für die Farbpalette, das Zeilen-Zeiger-Array und die Zeilen mit einem Byte pro Pixel (wenn ich mich recht erinnere).
Leider kann die GD-Lib ihre eigene Speicherverwaltung an PHP abgeben und was PHP daraus macht, scheint mir nicht berechenbar -- es sei denn, jemand erklärt mir die entsprechenden Teile der PHP-Quelltexte.
Das Problem ist auch nicht die Größe des belegten Speichers, sondern die Tatsache, dass PHP das Script beendet, anstatt lediglich eine Fehlermeldung zurückzugeben, wenn nicht ausreichend Speicher allokiert werden konnte. Die LibGD selbst macht letzteres, was dabei helfen würde, den Fehler abzufangen.
@Agassiz:
Du kannst entweder mit der combie-Formel (bei TrueColour bspw. die mit getImageSize() ermitteltete Pixelzahl * 5 + Festwert W) arbeiten oder dir im PHP-Handbuch die "fudge factors" aus den Benutzerkommentaren zu den entsprechenden Funktionen wie imageCreateFromPNG(), imageCreateFromJPEG(), imageCreateFromGIF() etc. zusammensuchen.
In den meisten Fällen wirst du dann keinen Scriptabbruch mehr erleben. Es gibt aber auch hier Ausnahmen, getImageSize() sagt nicht immer die Wahrheit (z.B. bei speziellen PNGs).
Am Ende bleibt es ein Herumpfuschen an den Symptomen. Das eigentliche Problem wäre nur mit einem Eingriff in den PHP-Quellcode zu beheben.
--
[1] "ziemlich genau", weil man zur exakten Berechnung des Speicherverbrauchs, die Pointer-Größe und die Alignment-Regeln der Speicherverwaltung des darunterliegenden Systems/C-Compilers herausfinden müsste, und ich weiß nicht, ob man das mit PHP hinbekommt.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (19-09-2009 um 12:45 Uhr)
|

20-09-2009, 03:54
|
|
Agassiz
Registrierter Benutzer
|
|
Registriert seit: Sep 2009
Beiträge: 6
|
|
Hab jetz die version genommen mit der vorherigen abfrage..
falls es jemanden interessiert hab ich hier den quellcode, in welchem sogar eine tabelle erzeugt wird, dynamisch mit der anzahl der bilder - tabelle ist 3 bilder breit...
PHP-Code:
<?php
$mypath = './owngallery/'; $filecounter = countfiles($mypath); $myimage = "./owngallery/azimage.jpg"; $thispage = "./owngallery/gallery.php"; $co = 1;
echo "<div id=\"gallerybla\" align=\"center\"> "; echo " <div align=\"left\"id=\"ausgabe\"> "; echo "<br><b>Meine eigene Gallerie :D </b><br><br><br>"; foreach (glob("./owngallery/*.*") as $file) { $orig_file = $file; $size = filesize("$file"); $readsize = ($size / 1024)/1024 ; $sizename = "MB"; if ($readsize < 1) { $readsize = $readsize * 1024; $sizename = "kB"; } $readsize = round($readsize, 2); if (is_dir($orig_file)) { //IS A DIRECTORY } else if (($orig_file != $thispage) && ($orig_file != $myimage)) { list($width, $height) = getimagesize($orig_file); $filesize = (($width * $height * 5)+(8000)); if ($filesize <= 25165824 ) { if ((strpos($orig_file,".jpg")!=null) || (strpos($orig_file,".JPG")!=null)) { if (($width < 600) && ($height < 400)) { leave_jpg($orig_file); } else { tablehead(); create_jpg_thumbnail($orig_file); tablebottom(); $co++; } } if (strpos($orig_file,".png")!=null) { list($width, $height) = getimagesize($orig_file); if (($width < 600) && ($height < 400)) { leave_png($orig_file); } else { create_png_thumbnail($orig_file); } } } else { $newfile = str_replace("./owngallery/", "", $file); tablehead(); printf('<td><br><a href="%s"><img src="'.$myimage.'"></a></td>', $file); tablebottom(); $co++; } } } echo "</div>"; echo "</div>"; function tablehead (){ global $co; if ($co == 1) { printf('<table>'); } if (($co%3) == 1) { printf('<tr>'); } } function tablebottom (){ global $co; global $filecounter; if ($co == $filecounter) { if ($co % 3 == 1 ) { printf ('<td></td><td></td></tr>'); } if ($co % 3 == 2 ) { printf ('<td></td></tr>'); } if ($co % 3 == 0 ) { printf ('</tr>'); } printf('</table>'); } } function create_jpg_thumbnail($orig_file){ global $co; $file = $orig_file; $img = $file; list($width, $height) = getimagesize($img); $src_posx = ($width /3) - 50 ; $src_posy = ($height /3) - 50 ; $newwidth = 150; // $width * $percent; $newheight = 150; //$height * $percent; $thumb = imagecreatetruecolor($newwidth, $newheight); $source = imagecreatefromjpeg($img); imagecopyresampled($thumb, $source, 0, 0, $src_posx, $src_posy, $newwidth, $newheight, $newwidth, $newheight); $newfile = str_replace("./owngallery/", "thumb_", $file); imagejpeg($thumb, $newfile);
printf('<td><br><a href="%s"><img src="%s"></a><br></td>',$file,$newfile); imagedestroy($source); imagedestroy($thumb); } function create_png_thumbnail($orig_file){ global $co; $file = $orig_file; $img = $file; list($width, $height) = getimagesize($img); $src_posx = ($width /3) - 50 ; $src_posy = ($height /3) - 50 ; $newwidth = 150; // $width * $percent; $newheight = 150; //$height * $percent; $thumb = imagecreatetruecolor($newwidth, $newheight); $source = imagecreatefrompng($img); imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); $newfile = str_replace("./owngallery/", "thumb_", $file); imagepng($thumb, $newfile);
tablehead(); printf('<td><br><a href="%s"><img src="%s"></a><br></td>',$file,$newfile); tablebottom(); $co++; imagedestroy($source); imagedestroy($thumb); } function leave_jpg($orig_file){ global $co; $file = $orig_file; list($width, $height) = getimagesize($file); $source = imagecreatefromjpg($img); $newfile = str_replace("./owngallery/", "thumb_", $file); imagejpg($source, $newfile); tablehead(); printf('<td><br><a href="%s"><img src="%s"></a><br></td>',$file,$newfile); tablebottom(); $co++; imagedestroy($source); imagedestroy($thumb); }
function leave_png($orig_file){ global $co; $file = $orig_file; list($width, $height) = getimagesize($file); $thumb = imagecreatetruecolor($width, $height); $source = imagecreatefrompng($file); imagealphablending($source, true); imagesavealpha($source, true); $newfile = str_replace("./owngallery/", "thumb_", $file); imagepng($source, $newfile); tablehead(); printf('<td><br><a href="%s"><img src="%s"></a><br></td>',$file,$newfile); tablebottom(); $co++; imagedestroy($source); imagedestroy($thumb); } function countfiles($mypath) { $handle = opendir($mypath); $filecount = 0; while ($res = readdir($handle)) { if (is_dir($res)) { } else { $filecount++; } } $filecount--; return $filecount; } ?>
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|