Est-il possible de combiner le contenu de 2 éléments de toile distincts en un seul élément de toile?
Quelque chose comme l'équivalent de "Aplatissement" de deux ou plusieurs calques dans Photoshop ...?
Je peux penser à une solution, mais je n'en suis pas si sûr. J'exporte le contenu des deux canvi (lol) sous la forme de .png, puis un troisième élément de canevas dessine les deux images avec une sorte d'algorithme de fusion (xor, blend, négatif, etc.).
Bien sûr, vous pouvez, et vous n'avez besoin d'aucune bibliothèque amusante, appelez simplement drawImage
avec un canevas comme image.
Voici un exemple où je combine deux éléments de toile sur un troisième:
http://jsfiddle.net/bnwpS/878/
Bien sûr, vous pouvez le faire avec seulement deux (un sur l’autre), mais trois en sont un meilleur exemple.
Vous pouvez toujours changer la globalCompositeOperation
si vous voulez un effet XOR ou autre.
canvas
n'ont pas d'arrière-plan spécifié en CSS. Cela les laissera transparent.Positionnez absolument tous vos éléments canvas
les uns sur les autres. Par exemple, enveloppez-les tous dans un <div class="canvas-layers">
et utilisez ensuite CSS comme:
/* Set to the same width/height as the canvases */
.canvas-layers { position:relative; width:400px; height:300px }
.canvas-layers canvas { position:absolute; top:0; left:0 }
Laissez le navigateur effectuer automatiquement le mélange des zones semi-transparentes les unes sur les autres.
drawImage
avec un canevas comme "image" source. Par exemple, voir:globalCompositeOperation
du contexte de la toile et utilisez drawImage
avec une toile comme source. Voir un exemple ici:J'ai créé une bibliothèque simple, légère et à code source ouvert, permettant d'exécuter les modes de fusion de style Photoshop d'un contexte HTML à un autre: context-blender . Voici l'utilisation de l'échantillon:
// Might be an 'offscreen' canvas
var over = someCanvas.getContext('2d');
var under = anotherCanvas.getContext('2d');
over.blendOnto( under, 'screen', {destX:30,destY:15} );
Voir le README pour plus d'informations.
Je pense que vous recherchez quelque chose comme la bibliothèque pixastic ( Documentation ).
Vous pouvez avec css position 2 (ou plus) toiles superposées et laisser chacune travailler comme une couche. Je ne suis pas sûr de savoir exactement comment faire cela avec les CSS, mais j'ai fait quelque chose de similaire, je dois contourner les uns sur les autres, un pour le contenu 2D et un pour Webgl et l'utilisateur pourrait facilement permuter entre eux.
<div height="640" style="position: absolute;">
<canvas width="640" style="position: absolute;visibility: hidden;" height="640" tabindex="1"></canvas>
<canvas width="640" height="640" style="visibility: hidden;position: absolute;"></canvas>
</div>
Je suppose que ce code n’est ni bullet proff, ni correct, mais cela fonctionne. J'espère que cela t'aides.
Si cela ne fonctionne pas, j'utiliserais la solution de contournement que vous avez mentionnée. (En fait, j'ai créé une application comme celle-ci, dans laquelle j'ai dessiné des ombres 2D sur un canevas hors écran et les ai dessinées sur la toile principale avec transparence, très joliment décorées)