PHP und SVG kombinieren

Alice

Erfahrenes Mitglied
Hallo. :)

Ich arbeite seit einiger Zeit an einem Projekt oder besser gesagt an einem Generator. Dieser kann Ortsschilder erstellen. Das große Problem an diesem Projekt ist, dass ich mit ziehmlich großen Grafiken arbeiten muss. Denn die erstelten Grafiken sollen von den Usern ausgedruckt und z.B. im Modellbau benutzt werden können. Also benötige ich die Ausgabe-Grafik in verschiedenen Größen. Also auch u.U. in DIN A4 usw.
Nach etliche Tests (ImageMagick usw.) bin ich zu dem Endschluss gekommen das nur Grafiken in den Dimensionen 10000x5000px und höher in Frage kommen. Denn es werden teilweise Fotorealistische Details verwendet die bei kleinere Grafiken nichts mehr mit Qualität zutun haben. Darauf möchte ich nicht verzichten.

Das Problem ist nun das der Speicher auf dem Server (Standard-Einstellung auf 64 MB) nicht ausreicht um so große Grafiken zu erstellen und zu verarbeiten. Ein User aus diesem Forum hat mir Vorgerechnet das alleine der Befehl imagecreatetruecolor(10000, 2000); schon ca. 95 MB braucht. Das ist zuviel des guten. Ich müsste das Speicher-Limit manuell auf mindestens 512MB (sogar 1024MB) einstellen damit das ganze Skript durchläuft. Ich habe zwar nur einen Webhost-Paket aber selbst mit einem eigenem Server wäre mir das zuviel.

Um es auf den Punkt zu bringen: GDLib ist für mein Vorhaben nicht geeignet. ImageMagick ist mir zu schlecht dokumentiert und selbst in ImageMagick-Foren und Unterforen gibt es nicht immer Support. Naja soll jetzt keine kritik sein. Ich bin für jede Hilfe dankbar.

Was mir jetzt noch einfallen würde wäre SVG. Das Problem ist das ich SVG nur am PC ganz gut kann. Ich kann also mit Inkscape usw. schöne Grafiken erstellen die genau meine Erwartungen erfüllen. Aber beim manuellen "schreiben" von SVG habe ich so meine Probleme.

Jetzt ist mir aber folgende Idee gekommen.

Mit SVG ist es möglich auch Pixel-Grafiken (z.B. PNG) zu laden und ich habe es ausprobiert und es funktioniert. Ich habe manuell eine Grafik erstellt die die Größe 20000x10000px hatte und die Grafik wurde SOFORT ohne Probleme im Browser angezeigt.

Meine Idee ist es jetzt alle benötigten Berechnungen, Pfade usw. usw. mit PHP zu verarbeiten und statt dann mit GDLib die Grafik "aufzubauen" ein SVG-Dokument zu erstellen, dieses auf den Server speichern und mit ImageMagick in ein Pixel-Format zu konvertieren.

Wo die Grenzen von SVG liegen weiss ich leider noch nicht aber scheint das es auch mit sehr großen Pixel-Grafiken gut zurecht kommt.

Meine erste Frage zu diesem Thema ist:

XML:
<image x="0" y="0" width="10000px" height="5000px" xlink:href="Background.png" />
<image x="200" y="1500" width="500px" height="2000" xlink:href="H.png" />
<image x="700" y="1500" width="500px" height="2000" xlink:href="A.png" />
<image x="1200" y="1500" width="500px" height="2000" xlink:href="L.png" />
<image x="1700" y="1500" width="500px" height="2000" xlink:href="L.png" />
<image x="2200" y="1500" width="500px" height="2000" xlink:href="O.png" />
<image x="2700" y="1500" width="500px" height="2000" xlink:href="@.png" />
<image x="3200" y="1500" width="500px" height="2000" xlink:href="A.png" />
<image x="3700" y="1500" width="500px" height="2000" xlink:href="L.png" />
<image x="4200" y="1500" width="500px" height="2000" xlink:href="L.png" />

So ein Code (so ähnlich) erzeugt (Stark vereinfacht) bei mir die gewünschte Grafik.

Jetzt möchte ich gerne diesen Code mit PHP in einer Schleife erzeugen. Ich habe aber keine Idee wie ich das Sinnvoll machen könnte. Eigentlich habe ich gar keine Idee.

Gegeben:
PHP:
$var1 = 'HALLO';
$var2 = '@';
$var3 = 'ALL';

Gesucht:
1.) width und height (sollte mit getimagesize funktionieren oder besser Hardcodet?)
2.) x und y
3.) Die Schleife die das kann

Ich bedanke mich im Vorraus und hoffe das mir jemand helfen kann.

PS: Ich würde auch gerne ein Feedback zu meiner Idee hören. Ist das so Sinnvoll wie ich das vor habe? Eine gute oder eher schlechte Idee?
 
Ich werde hier einfach mal Klartext sprechen: Die Schleife die du suchst hier nun wirklich sehr einfach und du bist einige Zeit mit PHP zu Gange. Ich werde dir keine Lösung dafür geben, nur einen Ansatz. Ich empfehle dir aber mal DRINGENGST dich da mal ordentlich einzuarbeiten.

1) Wenn width und height immer gleich sind, kannst du das auch hardcoden. Ansonsten musst du es ja auslesen.
2) x fängt bei 200 an und erhöht sich immer um 500. Das sollte mit einer Schleife und mathematischen Grundkentnissen zu bewältigen sein. y ist sogar konstant.

3) Siehe oben.

Statt den (unaussagekräftigen) Variablen, nutze Arrays, gerade für Schleifen:
PHP:
$str = array();
$str[0] = 'HALLO';
$str[1] = '@';
$str[2] = 'ALL';

Um die Strings in einzelne Buchstaben zu splitten, nutze str_split()
 
Hallo.

Ich bekomme den SVG-Code leider nicht in ein Array geladen.

PHP:
   for($i=0; $i < 1; ++$i) {
       $img_size = getimagesize($img_res);
       $img[] = array('IMG123' => '<image x="0px" y="0px" xlink:href="A.png" width="500px" height="1000px" />');
   }

Ich habe auch versucht x, y, width und height eine Variable zuzuordnen aber das bekomme ich nur eine weisse Seite.

Mit diesem Code ist das Array einfach nur leer.

Edit:

Eigenartig. Wenn ich das Array mit "print_r" ausgebe, scheint es doch nicht leer zu sein aber es wird kein einziges Zeichen angezeigt.

Was mache ich denn falsch?
 
Zuletzt bearbeitet:
Hallo. :)

So sieht der Code aktuell aus.

PHP:
   for($i=0; $i < 100; ++$i) {
       $img_size = getimagesize($img_res);
       $img[] = array('<image x="0px" y="0px" xlink:href="A.png" width="500px" height="1000px" />');
   }

Mein Ziel ist es das dies im Array steht:
PHP:
<image x="0px" y="0px" xlink:href="A.png" width="500px" height="1000px" />

Denn ich möchte das Array in eine TXT-Datei schreiben, speichern und dann die TXT-Datei in eine SVG-Datei umwandeln. Das klappt ja auch schon super. Nur der SVG-Image-Tag (Code) fehlt.

So soll das ganze dann später in der TXT-Datei stehen:
PHP:
<image x="0px" y="0px" xlink:href="H.png" width="450px" height="1000px" />
<image x="0px" y="0px" xlink:href="A.png" width="500px" height="1000px" />
<image x="0px" y="0px" xlink:href="L.png" width="480px" height="1000px" />
<image x="0px" y="0px" xlink:href="L.png" width="480px" height="1000px" />
<image x="0px" y="0px" xlink:href="O.png" width="550px" height="1000px" />
 
Dann brauchst du dafür überhaupt gar kein Array:
PHP:
$handle = fopen('meinedatei.txt', 'w');
$str = str_split("HALLO");
$size = sizeof($str);
for( $i = 0; $i < $size; $i++ ){
  fwrite($handle, '<img... '.$str[$i].'.png' ... />');
}
fclose($handle);

Da musst du jetzt nur noch den Rest der Attribute anpassen. Das müsstest du aber selber schaffen.
 
Hallo.

Also mein Code zum erzeugen einer SVG-Datei funktioniert schon ganz gut. Ich kriege das nur mit den X und Y (Pisition) in Pixel nicht wirklich hin.

Mein Code sieht aktuell so aus:
PHP:
   $var1 = 'H@A@L@L@O';

   for($i=0; $i < strlen($var1); ++$i) {
       $size1 = getimagesize($var1[$i].'.png');
       $size2 = $size2 + $size1[0];
       $img[] = "<image x='".$size2."px' y='0px' xlink:href='".$var1[$i].".png' width='".$size1[0]."px' height='".$size1[1]."px' />";
   }

   $img = str_replace("'", '"', $img);
 
Vorweg ein kleiner Tipp: Die Stringlänge vor der Forschleife abzuspeichern anstatt die Funktion strlen() jedesmal in der Forschleife zu nutzen spart Performance.

Was soll denn bei x und y stehen?
 
Danke für den Tipp.

Bei X soll als ertes 0 stehen und dann z.B. 550. Also so das alle Grafiken nebeneinander von links nach rechts lückenlos aufgelistet werden. Mit meinem Code fängt die erste Grafik erst bei ca. 560px an.

Danke.
 
Schon klar, wenn du die x-Position ausrechnest, bevor du die erste Grafik platziert hast.

Wenn alle Grafiken gleich Breit sind, dann hau die Breite hardcoded ins Script oder nutz folgendes.
PHP:
$var1 = 'H@A@L@L@O';

   for($i=0; $i < strlen($var1); ++$i) {
       $size1 = getimagesize($var1[$i].'.png');
       $size2 = $size1[0]*$i;
       $img[] = "<image x='".$size2."px' y='0px' xlink:href='".$var1[$i].".png' width='".$size1[0]."px' height='".$size1[1]."px' />";
   }

   $img = str_replace("'", '"', $img);

Absolute Berechnungen sind besser, weil du da nicht so schnell Fehler machst.
 
Zurück