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