PHP-generiertes Bild in DB speichern

Jakob

Aktives Mitglied
Thread Starter
Dabei seit
05.01.2004
Beiträge
1.070
Reaktionspunkte
21
Hallo,

ich werkel schon den ganzen Tag dran rum, bekomm aber nichts funktionierendes hin:

Es wird ein Bild hochgeladen und in die Datenbank gespeichert. Zusätzlich zu dem Bild wird auch noch eine Graustufen-Version gespeichert, die PHP automatisch aus dem vorhandenen Bild herstellt.

Gelöst habe ich das so:
PHP:
   for ($y = 0; $y <$img_height; $y++) { 
       for ($x = 0; $x <$img_width; $x++) { 
           $rgb = imagecolorat($sourceImage, $x, $y);
           // … verschiedenste Operationen
           imagecolorallocate ($sourceImage, $gray, $gray, $gray);
       }
   }

   $destinationImage = ImageCreateTrueColor($img_width, $img_height);
   imagecopy($destinationImage, $sourceImage, 0, 0, 0, 0, $img_width, $img_height);

   // create file on disk
   imagejpeg($destinationImage, $destinationFileName);
   
   // destroy temp image buffers
   imagedestroy($destinationImage);    
   imagedestroy($sourceImage);

Problem ist, ich möchte nicht die Datei speichern, sondern das Bild in die Datenbank in ein BLOB stecken. Mit dem unveränderten Bild geht das einfach mit
PHP:
// read photo
		$tempFile = fopen($tempFileName, "r");
		$binaryPhoto = fread($tempFile, fileSize($tempFileName));
           // …
mysql_query("INSERT INTO table (bild) VALUES ('$binaryPhoto')");

Wie aber bekomme ich das von PHP generierte da rein? Danke!
 
Zuletzt bearbeitet:
wieso geht das denn mit $destinationImage nicht auf die gleiche Weise? Wäre vielleicht interessant das zu wissen!
 
imagejpeg() erstellt eine Datei aus der ersten Variable. Die zweite ist optional, wird sie weggelassen, bekommt man direkt den Stream. Ich konnte den aber noch nicht abfangen.

Wie meinst Du das mit $destinationimage? Eine Datei erstellen, per fopen und fread lesen, Datei löschen und Gelesenes in die DB? Das wäre meine Notlösung, aber der Schritt (Datei erstellen, auslesen und löschen) ist ja eigentlich unnötig.

Habe mit Bildern leider gar keine Erfahrung in der Hinsicht. Ich müsste wissen mit welcher Operation man eine binäre Version aus einem PHP-generierten Bild generiert.
 
Zuletzt bearbeitet:
ich hab da auch keine Erfahrungen, einfach weil das beste DBMS für Bilder m.E. immer noch das Dateisystem ist. Aber Deine Frage war so nicht klar ( zumindest für mich). Hoffe Dir wird jetzt geholfen

Gruß Karsten
 
Probier mal das:
// read photo
$tempFile = fopen($destinationFileName, "r");
$binaryPhoto = fread($tempFile, fileSize($destinationFileName));
// …
mysql_query("INSERT INTO table (bild) VALUES ('$binaryPhoto')");
 
Ich würde an Deiner Stelle auch die Bild-DB-Einträge lassen. Das nimmt viel zuviel Platz und vor allem Performance weg. Speichere den Originalnamen, die Extension (und meinetwegen den Pfad) in der DB und lies es aus dem Dateisystem des Rechners aus. So kann auch ein DB-Crash kaum die Daten anrühren und wer weiß, wie groß die Speicherung in der DB ist, anstatt auf dem Dateisystem.

Für unique-Namen kannst Du z.B. einen Hashcode nehmen (z.B. über md5(time()); ). Damit verhinderst Du eben, dass jemand alte Bilder überschreibt oder neue nicht hochladen kann. Ein Bild aus der DB laden ist auf jeden Fall inperformanter, als ein auslesen der Dateinamen und Aufruf über das Dateisystem.
 
Jakob schrieb:
imagejpeg() erstellt eine Datei aus der ersten Variable. Die zweite ist optional, wird sie weggelassen, bekommt man direkt den Stream. Ich konnte den aber noch nicht abfangen.

Hast du schon ob_start() probiert?

http://de2.php.net/ob_start

Weiss jetzt nicht ob das auch für Streams hinhaut.

Gruß, Micha
 
Hallo, ich hab's nicht hinbekommen, ohne den Umweg über eine Datei zu gehen. Meine Lösung ist jetzt: Wie anfangs gezeigt eine Datei erstellen, diese auslesen, löschen und in die DB schreiben.

In dem Fall hab ich mich für eine DB-Lösung mit Bildern entschieden, da es ein System ist, was kleine PDFs zur Verfügung stellt. Dazu gehören 2 Bilder, das PDF und Text. Jedes PDF mit allen Zusatzinfos ist eine Zeile in der DB-Tabelle und somit kann ich sehr einfach rumschieben, löschen und editieren. Der Performance-Unterschied ist nicht zu spüren, da es sehr wenige PDFs sind.
 
Zurück
Oben Unten