Bild aus DB generieren

Microhome

Erfahrenes Mitglied
Moin moin,
ich hab in einer Datenbank 10.000 Einträge stehen, welche jeweils einer x- und einer y-Koordinate zugeordnet sind. Nun möchte ich aus diesen Farben ein Bild erzeugen. Das Problem liegt darin, dass es ewig dauert dieses zu generieren. Habt ihr eine Idee, wie ich das ganze verkürzen kann, bzw. ob das Generieren mit Ruby oder Pyhton schneller gehen würde?!

Hier ein Codeauszug:
Code:
$img = @imagecreatetruecolor(100,100);
for ($y = 0; $y < 100; $y++) {
        for ($x = 0; $x < 100; $x++) {
                $res = mysql_query("SELECT color FROM griddata WHERE x LIKE \"$x\" AND y LIKE \"$y\" LIMIT 1");
                $check = mysql_fetch_object($res);
                $farbe = $check->color;
                imagefilledrectangle($img, $x, $y, $x+1, $y+1, $farbe);
        }
}
header("Content-type: image/jpeg");
imagejpeg($img, "aktuell.jpg");


Vielen Dank!
m!crohome
 
Hi Gumbo,
ersteinmal vielen Dank für deine Hilfe. Wie genau meinst du das mit den zeilenweisen Abfragen? Ich glaube, dass vorallem die Abfragen so lang dauern und weniger das Erstellen des neuen Bildes...
 
Deswegen ja der Vorschlag, die Informationen der Grafik zeilenweise abzufragen (eine Pixelgrafik besteht ja auch aus Zeilen und Spalten).
 
Ja, nur wie?
Außerdem habe ich noch folgendes Phänomen festgestellt. Die PHP Datei führe ich über die Kommandozeile auf meinem Hosteurope VServer aus. Komischerweise benötigt das erste Ausführen des Scripts immer wesentlich länger als die darauffolgenden. Hier im Beispiel mit 90x90 Pixeln:

1. Mal:
> php createpic.php
Ausführungsdauer: 108.922474146 Sekunden

2. Mal:
> php createpic.php
Ausführungsdauer: 5.92906403542 Sekunden


Woran kann das liegen?
 
Vielleicht werden die Ergebnisse im Cache zwischengespeichert.

Probier mal Folgendes:
PHP:
$img = imagecreatetruecolor(100,100);
for ($y = 0; $y < 100; $y++) {
	$res = mysql_query("SELECT x, color FROM griddata WHERE y = $y ORDER BY x");
	while ($pixel = mysql_fetch_assoc($res)) {
		imagesetpixel($img, $pixel['x'], $y, $pixel['color']);
	}
}
header("Content-type: image/jpeg");
imagejpeg($img, "aktuell.jpg");
 
Hmm das scheint irgendwie nicht zu funktionieren. Das Script läuft und läuft aber kommt nicht zum Ende. Hab es mal mit 10x10 Pixeln versucht, aber auch da bekomme ich kein Ergebnis.

Code:
$img = imagecreatetruecolor(10,10);
for ($y = 0; $y < 10; $y++) {
    $res = mysql_query("SELECT x, color FROM griddata WHERE y LIKE \"$y\" ORDER BY x ASC");
    while ($pixel = mysql_fetch_assoc($res)) {
        imagesetpixel($img, $pixel['x'], $y, $pixel['color']);
    }
}
 
Versuche irgendwie die Fehlerquelle genauer zu lokalisieren.

Führe den Query doch erstmal aus und speichere alles in ein 2 Dimensionales Array.
Schau dir das Array mit var_dump(); an und check ob es geklappt hat.

Dann geh die Schleife ohne imagesetpixel durch und geb dir die Daten so aus, um sicherzustellen, dass das auch so klappt.

Wenn du dir dann sicher bist das alles so ist wie es sein sollte damm mach es mit imagesetpixel.
Führe das Script vllt auch mal bei dir Lokal aus und setze die max_execution time höher.

Wenn ich einen Fehler entdecke versuche ich immer erst einmal solch einen Weg um zu sehen was falsch ist.
 
Zurück