Information Technology Reference
In-Depth Information
Die beiden Eingabefelder vom Typ
number
bewirken bei jeder Veränderung ihres
Inhalts, dass die Funktion
updateProgressBars()
aufgerufen wird. In ihr werden
die Fortschrittsbalken und die Platzhalter für die Ausgabe der Ergebnisse er-
zeugt. Die beiden Schaltflächen
MIT
beziehungsweise
OHNE
starten die Berech-
nung der Höhenprofile.
Im JavaScript-Code extrahieren wir als ersten Schritt die Höhenwerte aus dem
PNG-Bild. Dazu laden wir dieses in ein neues
canvas
-Element:
var canvas = document.createElement("CANVAS");
canvas.width = 300;
canvas.height = 300;
var context = canvas.getContext('2d');
var image = document.querySelector("IMG");
context.drawImage(image,0,0);
// document.querySelector("BODY").appendChild(canvas);
var elev =
context.getImageData(0,0,canvas.width,canvas.height).data;
var alpha = [];
for (var i=0; i<elev.length; i+=4) {
alpha.push(elev[i+3]);
}
In der Variable
image
wird das einzige
img
-Element auf der Webseite geladen
und anschließend auf das neu erzeugte
canvas
-Element gezeichnet. Auf der
Webseite ist weder das Bild noch das Canvas sichtbar, da das
img
-Element mit
display:none
gekennzeichnet ist und das Canvas nie an den DOM-Baum ange-
hängt wird. Wenn Sie die oben auskommentierte Zeile aktivieren, sehen Sie das
Canvas am Ende der Seite. Wie Sie aus dem Kapitel 5, Canvas, wissen, liefert
die
getImageData()
-Funktion ein Array mit den Farb- und Alpha-Kanal-Wer-
ten des Canvas (jeweils vier Einträge pro Pixel). Da für dieses Beispiel nur die
Alpha-Kanal-Werte interessant sind, extrahieren wir diese mit der
for
-Schleife
aus dem Array. Diese Datenreduktion ist deshalb sinnvoll, weil jeder Worker
eine Kopie des Arrays erhält. Wenn wir also viele Worker parallel starten, so
wächst der Speicherverbrauch linear mit jedem Worker an.
Die
calcProfiles()
-Funktion startet schließlich die Berechnung mit oder ohne
Worker, je nachdem, ob
true
oder
false
an die Funktion übergeben wird:
calcProfiles = function(useWorker) {
USE_WORKER = useWorker;
startTime = new Date();
for (var i=0; i<PROFILES; i++) {
var imgData = {