Mailinglisten-Archive |
Hallo Liste!
Ich habe hier folgendes Problem:
Der Benutzer soll sich eine Grafik anzeigen lassen können, die aus
mehreren Ebenen besteht. Konkret handelt es sich um eine ca.
500x500 Pixel große Landkarte mit mehreren Layern. In der einen
Ebene befinden sich die Strassen, in der zweiten die Städte usw.
Der Benutzer soll nun mit Checkboxen auswähen, welche Ebenen
er sehen will und welche nicht (z.B. nur Autobahnen aber keine
Landstraßen). Nach drücken eines Buttons werden dann vom php-
Script die gewünschten Ebenen übereinander gelegt und so die
Karte generiert und ausgegeben.
Die einzelnen Ebenen (max. 10) habe ich als jeweils eigenständige
500x500 Pixel große GIF-Dateien vorliegen. Der naive Ansatz wäre
nun, in jeder Ebene eine Farbe, z.B. weiss, als Transparent zu
nehmen. Von der untersten Ebene ausgehend werden nun
nacheinander alle Ebenen geladen und die nichttransparenten Pixel
mit ineinander geschachtelten Schleifen in die Zielgrafik kopiert
(Beispiel aus dem Kopf getippt und so nicht getestet):
for ($nr=$maxebene;$nr>0;$nr--) { // Alle Ebenen durchgehen
if ($ebenegewuenscht[$nr]) { // Soll Ebene verwendet werden?
for ($x=0; $x<$breite; $x++) {
for ($y=0; $y<$hoehe; $y++) {
$farbe = ImageColorAt($ebene[$nr], $x, $y);
if ($farbe != $transparent) ImageSetPixel($zielbild,$x,$y,$farbe);
// Nichttransparente Pixel rüberkopieren
}
}
}
}
Man könnte natürlich alle möglichen Kombinationen schon
vorberechnen lassen und dann als einzelne Grafiken abspeichern,
aber das ist eben nicht das, was ich will (und z.B. bei 10 Ebenen
auch ein nicht machbarer Aufwand). Das Script wird wohl nicht
sehr oft aufgerufen, wahrscheinlich max. 1-2 mal pro Tag, es
braucht also nicht so unheimlich optimiert zu sein, aber irgendeine
effektivere Möglichkeit muss es doch trotzdem geben...?
ciao.. Thilo
php::bar PHP Wiki - Listenarchive