Grafik modifizieren

Moin

Schau dir mal das Open Source Script von Landkampf Lite an (Google). Da gibt es die Datein map.php und mapgd.php die genau das machen was du willst - und da es Open Source ist kannste daran ja auch lernen wie es geht.

lenny
 
Hab den Bereich in dem Tut erreicht, den ich suche xD
Aber so ganz wirklich schnall ich das nich, da es dort ziemlich unklar erklärt ist...
Das ist so ziemlich das was ich ja vorhab: http://macx.de/essays/gdlib/wasserzeichen.html
Aber die Erklärung zu dem Befehl:
imagecopymerge(dest_image, resource_image, dest_x, dest_y, src_x, src_y, src_w, src_h, percent transition)
Fügt zwei Bilder zusammen

Ist Müll ^^

Welcher Wert soll da denn nu was festlegen!?
Schon mal einen Blick ins Manual geworfen? http://php.net/imagecopymerge
 
Die GD implentation ist Speicherintensiv und CPUfressend, gerade was so Riesenbilder angeht. Bei einer gut besuchten Seite wird der Server gut zu arbeiten haben.
Soll dies nun in einem Browsergame passieren und viele User klicken öfters auf diese Karte wird dies der Overkill.
Ich würde die erste Antwort (die übrigens nach 2 Stunden kam) beherzigen und das Problem mit gutem CSS und HTML lösen. Für das Klicken auf einen der 5x5x px Quadranten noch JavaScript mit ins Boot holen.

Desweiteren ist bei so einer grösse auch die Ladezeit und der Traffic nicht zu verachten.
Bsp:
http://upload.wikimedia.org/wikiped...rld_map_with_oceans_marked_in_blue-edited.png
Die Karte ist relativ nackt und hat eine Dateigrösse von ca 125kb. Mit mehr Farben und Details könnte es gut an die 200kb gehen. Bei 1000 Aufrufen pro Tag ist man da schon bei 200MB, im Monat 6Gbyte.
Die theorethischen Ladezeiten halten sich zwar in Grenzen (DSL 6000 deutlich weniger als 500ms), aber der Browser muss es auch rendern, ergo > 1sec wartezeit + die Bearbeitungszeit durch PHP für das Bild.

Dann zur Benutzerfreundlichkeit:
Bei einer Standardauflösung von 1024*768 ist der Scrollaufwand enorm. Willst du das dem User antun?

Ich würde dir raten deine logisch 3000x3000 Karte in bsp. 500x500px kleine Areas zu schneiden. Und wenn der Benutzer eine Area nach "rechts" will, dann kann er auf einen Pfeil klicken und die Seite relaoded (oder ganz modern per Ajax).
Die Positionierung der Grafiken würde ich per CSS lösen, das spart dem Server eine Menge arbeit (nur 2-3 einfache mathematische Formeln für die Position des Bildes in der Area).

Wenn du denn noch diese Riesenkarte mit GD direkt bearbeiten willst, dann führe erstmal ein paar Benchmark Tests durch um zu sehen, wie sich die Geschwindigkeit und Serverauslastung bei einer gewissen Load verhält.
Ich hab hier mal eben ein Test gemacht für Imagecopymerge gemacht (source von einem Usercomment auf php.net etwas modifiziert)

PHP:
<?php
function cust_memory_get_usage()
{
     $pid = getmypid();
     exec("ps -o rss -p $pid", $output);
     return $output[1] *1024;
}
function waterMark($fileInHD, $wmFile, $transparency = 50, $jpegQuality = 90, $margin = 5) {
 $wmImg   = imageCreateFromJPEG($wmFile);
 $jpegImg = imageCreateFromJPEG($fileInHD);

 for($i = 0; $i <4; $i++) {
   $wmX = (bool)rand(0,1) ? $margin : (imageSX($jpegImg) - imageSX($wmImg)) - $margin;
   $wmY = (bool)rand(0,1) ? $margin : (imageSY($jpegImg) - imageSY($wmImg)) - $margin;

    // Water mark process
   imageCopyMerge($jpegImg, $wmImg, $wmX, $wmY, 0, 0, imageSX($wmImg), imageSY($wmImg), $transparency);
 }
 imagejpeg($jpegImg, $fileInHD, $jpegQuality);
}

echo "Start Script: Time:\t".microtime(TRUE)."\t\t Mem: ".cust_memory_get_usage()."\n";

waterMark('myImage.jpg','watarmark.jpg');

echo "End Script: Time:\t".microtime(TRUE)."\t\t Mem: ".cust_memory_get_usage()."\n";
?>
Ergebnis:
Start Script: Time: 1205082262.15 Mem: 8339456
End Script: Time: 1205082263.07 Mem: 8732672
Habs in der commandline ausgeführt, sodass da kein Browserrender oder grosses Datenübertragung im Netzwerk passieren muss.
Ergebnis ist ca 1sek ausführungszeit, bei 4 gesetzen Watermarks (50x50px).

Hoffe das reicht dir als Antwort. Der Rest ist in den Manuals unter http://www.php.net/gd nachzulesen.

Edit:
Achja. fast vergessen. Das von PHP geschriebene JPEG ist knapp 950kb gross geworden. Weiss nicht, ob man an der Kompression spielen kann.
 
Zurück