Copier le canevas via toDataURL après l'opération de tirage ne fonctionne pas

J'essaie de copier le contenu d'une toile vers une autre avec ce code:

generateThumbnail: function(i) { var thumbnailImage = new Image(); thumbnailImage.src = $("canvas")[i].toDataURL(); var thumbnailCanvas = $("#thumbnail")[0]; var ctx = thumbnailCanvas.getContext("2d"); ctx.drawImage(thumbnailImage, 0, 0); } 

Cela fonctionne, mais pas si je viens de terminer une opération de dessin (par exemple, le remplissage de ligne). Si je viens de terminer une opération de tirage, il ne fait rien lors de la première exécution, mais si je l'appelle une deuxième fois, cela fonctionne. Cela semble très étrange, et je ne doute pas pourquoi cela se produit.

C'est comme si la toile se trouvait dans une sorte d'état non valide d'où elle ne peut être lue ou quelque chose.

Le code qui trace la ligne est ici:

 eraseLine: function(o) { var c = this.context; var lineWidth = o.radius * 2; // Stroke Line if (this.stroke) { c.lineWidth = lineWidth + 4; c.globalCompositeOperation = 'source-atop'; c.strokeStyle = this.strokeColor; c.beginPath(); c.moveTo(o.x0, o.y0); c.lineTo(o.x1, o.y1); c.stroke(); } // Erase Line c.lineWidth = lineWidth; c.lineCap = 'round'; c.strokeStyle = 'rgba(255, 255, 255, 1)'; c.globalCompositeOperation = 'destination-out'; c.beginPath(); c.moveTo(o.x0, o.y0); c.lineTo(o.x1, o.y1); c.stroke(); c.globalCompositeOperation = 'source-over'; } 

J'ai testé ceci sur Chrome 11 et Firefox 5, et cela arrive sur les deux. Des idées pour lesquelles cela se produit?

Pouvez-vous essayer cela?

 generateThumbnail: function(i) { var thumbnailImage = new Image(); thumbnailImage.onload = function() { var thumbnailCanvas = $("#thumbnail")[0]; var ctx = thumbnailCanvas.getContext("2d"); ctx.drawImage(thumbnailImage, 0, 0); } thumbnailImage.src = $("canvas")[i].toDataURL(); } 

Il semble que le chargement de cette image dure plus longtemps après avoir effectué une opération de dessin. L'image n'est donc pas chargée lorsque vous exécutez la commande drawImage . La deuxième fois que vous appelez cette fonction, l'image semble se charger plus rapidement. Quoi qu'il en soit, vous devez toujours utiliser l'événement Onload lorsque vous chargez une image.