2016-04-29 8 views
2

Ich habe ein Bild, das ich auf einer Leinwand rendern möchten. Wenn ich es so rende:Javascript Bild nicht auf Leinwand nach dem Zeichnen es auf Offscreen Canvas

context.drawImage(image, x, y); 

Es funktioniert wie erwartet. Jedoch, wenn ich dies tun:

if (image.loaded) 
    image = getPreRendered(image); 
... 
var renderedImages = []; 
var tmpImage = null; 
function getPreRendered(img) { 
    imageIndex = ("" + img.src); 
    tmpImage = cachedSprays[tmpIndex]; 
    if (tmpImage == undefined) { 
     var tmpCanvas = document.createElement("canvas"); 
     var tmpContext = tmpCanvas.getContext('2d'); 
     tmpCanvas.width = 50; 
     tmpCanvas.height = 50; 
     tmpContext.drawImage(img, 0, 0, 100, 100); 
     tmpContext.imageSmoothingEnabled = false; 
     tmpContext.webkitImageSmoothingEnabled = false; 
     tmpContext.mozImageSmoothingEnabled = false; 
     tmpContext.drawImage(tmpCanvas, 0, 0, 50, 50, 0, 0, 100, 100); 
     tmpImage = tmpCanvas; 
     cachedSprays[imageIndex] = tmpImage ; 
    } 
    return tmpImage ; 
} 

Als ich dies jedoch tun, ist das Bild nicht mehr sichtbar auf der Leinwand.

Das Bild wird wie folgt erstellt:

var image = new Image(); 
image.loaded = false; 
image.onload = function() { 
    image.loaded = true; 
}; 
+0

JS ist asynchron. Ein Bild wird/würde geladen, aber Sie haben diese Funktion bereits aufgerufen, während das Bild noch geladen wurde. –

+0

Überprüfen Sie, was die Konsole sagt? – Dellirium

+0

könnten Sie mehr von Ihrem Code zeigen? Was ist 'tmpIndex'? Warum checkst du eine Schleife ein, wenn dein Bild geladen ist, anstatt "getPreRendered" direkt im Onload-Callback aufzurufen? – Kaiido

Antwort

1

AJAX und Bild Anrufe sind asynchrone. Ein Bild wird/würde geladen, aber Sie haben diese Funktion bereits aufgerufen, während das Bild noch geladen wurde.

var image = new Image(); 
image.onload = function() { 
    // call here your render canvas function: 
    getPreRendered(image); 
}; 
image.src = "nOOdes.jpg" 
+0

getPreRendered (Bild) Funktion wird innerhalb einer Spielschleife aufgerufen. Es wird also versucht, es kontinuierlich vorzurendern. –

+1

Genau genommen ist JS nicht asynchron, nur einige DOM-Elemente und verschiedene APIs (wie Image) sind asynchron. Pures Javascript kann asynchron nichts tun. – Blindman67

+1

@ Blindman67 Danke für's Bemerken. Ich meinte etwas anderes und schob die Antwort weg. OFC JS ist streng syncronous, es ist der AJAX und Anfragen, die nicht sind. –

Verwandte Themen