Bild öffnen, verkleinern - UND Speichern
Torwächter
- php
Hallo zusammen,
ich möchte ein Bild öffnen, verkleinern und dann auch speichern, das Problem, mein Script speichert nicht:
Für eine Lösung wäre ich sehr dankbar.
Greetings
Master
<?php
header ("Content-type: image/jpeg");
//Die aufzurufende Datei
$file = "41-Master.jpg";
//Weite und Höhe des auszugebenden Bildes
$width = 80;
$height = 100;
$scource = imagecreatefromjpeg($file);
$destination = imagecreate($width, $height);
//Bild kopieren und resizen
imagecopyresized($destination, $scource, 0, 0, 0, 0, $width, $height, imagesx($scource), imagesy($scource));
//Bild finden und zerstoeren
imagejpeg($destination);
imagedestroy($destination);
?>
//Bild finden und zerstoeren
imagejpeg($destination);
imagedestroy($destination);
So mach ich es bei mir.
ImageJPEG($bild,$destination);
Und ich kann dir empfehlen, wenn die GDlib 2.x eingespielt ist
imagecopyresampled();
zu nutzen
Hallo,
ImageJPEG($bild,$destination);
Da bringt er bei mir nur ein schwarzes Bild :(
Greetings
Master
Moin!
ImageJPEG($bild,$destination);
Da bringt er bei mir nur ein schwarzes Bild :(
Weil du (bzw. andi123) die Parameter vertauscht hast.
Lies http://de3.php.net/manual/de/function.imagejpeg.php, da steht, wie du mit imagejpeg() ein Bild als Datei speichern kannst.
- Sven Rautenberg
Hallo,
Danke für deine Antwort.
So ?:
<?php
header ("Content-type: image/jpeg");
//Die aufzurufende Datei
$file = "41-Master.jpg";
//Weite und Höhe des auszugebenden Bildes
$width = 80;
$height = 100;
$scource = imagecreatefromjpeg($file);
$destination = imagecreate($width, $height);
//Bild kopieren und resizen
imagecopyresized($destination, $scource, 0, 0, 0, 0, $width, $height, imagesx($scource), imagesy($scource));
//Bild finden und zerstoeren
imagejpeg($destination,$file);
//imagedestroy($destination);
?>
Moin!
Danke für deine Antwort.
So ?
Du darfst ein Bild auch gerne zweimal mit imagejpeg() ausgeben. Einmal in eine Datei, und einmal direkt an den Browser.
Ich habe mir mal eine nette Funktion geschrieben, die mir aus den Bildern meiner Digitalkamera Thumbnails mit Bilddaten erzeugt:
<img src="http://www.rtbg.de/images/kirschbluete.jpg" border="0" alt="">
Die Funktion gibt die Thumbnails aus. Da mein Server (nicht der, von dem jetzt das Bild kommt) lahm ist (Pentium 90), und das Generieren des Thumbnails ewig dauert, lege ich einen Cache an. Weil das Skript aber immer ein Bild an den Browser senden muß, und nur wenn kein Cache-Bild vorhanden ist, es speichern soll, mache ich am Skriptende z.B. sowas:
[...]
// Speichern auf Festplatte
imagePng($dst_img,$_SERVER['DOCUMENT_ROOT']."/albumtest/cache/".md5($_REQUEST['file'].$_REQUEST['orientation']));
// Ausgabe an den Browser
header("Content-type: image/png");
header("Last-Modified: " . gmdate("D, d M Y H:i:s", filemtime($_SERVER['DOCUMENT_ROOT']."/albumtest/cache/".md5($_REQUEST['file'].$_REQUEST['orientation']))) . " GMT");
header("Expires: " . gmdate("D, d M Y H:i:s", (time()+86400) ) . " GMT"); // Expires: 1 Tag von heute an.
imagePng($dst_img);
exit;
?>
//Bild finden und zerstoeren
imagejpeg($destination,$file);
//imagedestroy($destination);
Es erscheint mir an dieser Stelle bei deinem Skript aber als ungünstig, den Dateinamen der Originaldatei zu verwenden. Davon wird das Bild nicht besser, wenn es immer und immer wieder neu komprimiert und (wenn auch 1:1) verkleinert wird. Du solltest einen anderen Namen für den Thumbnail verwenden.
- Sven Rautenberg
Hallo Sven
Danke für deine Antwort.
Ich habe schon per Perl das Bild(a) in ein extra verzeichnis kopiert und will nun mit PHP das Bild nur noch verkleinern (es soll/wird nur einmal verkleinert).
Meinst Du, es gibt Probleme, wenn ich die alte Datei einfach überschreibe ?
Soll ich vielleicht aus dem Ordner mit den Originalgroßen Bildern die Datei holen und dann verkleinert abspeichern ?
(Ich wäre Dir sehr dankbar, wenn Du mir den Code ausbessern/verbessern könntest, da das mein erstes PHP-Script ist. Vielen Dank.
Greetings
Torwächter
Moin!
Ich habe schon per Perl das Bild(a) in ein extra verzeichnis kopiert und will nun mit PHP das Bild nur noch verkleinern (es soll/wird nur einmal verkleinert).
Naja, dann ist überschreiben zwar nicht falsch, aber es gibt auch keinen Grund, das _jedesmal_ zu tun.
Meinst Du, es gibt Probleme, wenn ich die alte Datei einfach überschreibe ?
Nein, eigentlich nicht. Ich vermute, die entsprechenden Funktionen sind atomar, so dass du gleichzeitige Zugriffe nicht fürchten mußt. Dabei bin ich mir allerdings nicht 100% sicher.
Soll ich vielleicht aus dem Ordner mit den Originalgroßen Bildern die Datei holen und dann verkleinert abspeichern ?
Ja. Insbesondere kannst du dabei ganz schnell feststellen, ob du diese (rechenaufwendige!) Arbeit bereits erledigt hast, indem du _vorher_ einfach nachguckst, ob die Zieldatei schon existiert (mit file_exists($dateiname)).
(Ich wäre Dir sehr dankbar, wenn Du mir den Code ausbessern/verbessern könntest, da das mein erstes PHP-Script ist. Vielen Dank.
So schlecht ist der doch gar nicht. Außerdem lernst du es dann nicht.
Im übrigen bist du hier im Forum schon so lange unterwegs - da solltest du doch wissen, dass es hier kaum fertigen Code gibt, Hilfe zur Selbsthilfe dagegen jede Menge. Außerdem glaube ich nicht, dass die Aufgabe zu schwierig für dich ist - du hast jede Menge Gelegenheit, mit deiner Aufgabe zu wachsen. :)
- Sven Rautenberg
Morgen,
danke für das Vertrauen :)
jaja, ich war faul.
hier der Code:
Aber es wird nun überhaupt kein Bild mehr angezeigt !?
(resized wird es sehr schön, es musste nur der file name nochmals gesetzt werden...)
Greetings
Torwächter
<?php
header ("Content-type: image/jpeg");
//Die aufzurufende Datei
$file = "41-Master.jpg";
$newfile = "41-Master.jpg";
//Weite und Höhe des auszugebenden Bildes
$width = 80;
$height = 100;
$scource = imagecreatefromjpeg($file);
$destination = imagecreate($width, $height);
//Bild kopieren und resizen
imagecopyresized($destination, $scource, 0, 0, 0, 0, $width, $height, imagesx($scource), imagesy($scource));
imagejpeg($destination,$newfile);
?>
Moin!
Aber es wird nun überhaupt kein Bild mehr angezeigt !?
(resized wird es sehr schön, es musste nur der file name nochmals gesetzt werden...)
Vergleiche deinen Code mit meinem Code. Ich rufe imagejpeg() (oder war es imagepng()? Egal, hat den selben Effekt) zweimal auf - einmal zum Speichern auf Platte, und einmal zur Ausgabe an den Browser.
Du hingegen rufst die Funktion nur einmal auf - zum Speichern auf Platte. Und vorher hattest du den Funktionsaufruf zur Ausgabe an den Browser.
U know, what I mean?
- Sven Rautenberg
Ahha, that mean, ich speicher nur und geb es nicht auch noch aus.
Danke dir, werd es versuchen.
Greetings
Torwächter