Bonjour,
Sur une image chargée dans un canvas via drawImage, je cherche à implémenter une fonction (JavaScript avec JQuery) permettant le tracé élastique d'un rectangle avec le clic de souris comme les Boîtes de sélections qu'on obtient sur le bureau de Windows 10.
En m'inspirant du Web, j'ai le code :
Ce code ne me donne pas satisfaction !
Mon idée est, utilisant les événements souris, de tracer sur le fond du canvas par strokeRect, des rectangles au fur et à mesure du déplacement de la souris, événement mousemove.
Avec globalCompositeOperation = 'xor', je pense que deux tracés consécutifs du même rectangle devraient s'annuler, laissant réapparaître l'image de fond.
Ce n'est hélas pas ce qui se passe, comme si le xor ne fonctionnait pas ?
Merci de m'avoir lu jusqu'à ce point, et merci si vous avez une idée pour venir à mon aide.
Bien cordialement.
Yves
Modifié par goggi (10 Oct 2022 - 10:25)
Sur une image chargée dans un canvas via drawImage, je cherche à implémenter une fonction (JavaScript avec JQuery) permettant le tracé élastique d'un rectangle avec le clic de souris comme les Boîtes de sélections qu'on obtient sur le bureau de Windows 10.
En m'inspirant du Web, j'ai le code :
<canvas id="canvas" width="1000" height="700"></canvas>
<div id="output">output</div>
<script>
$(document).ready(function(){
//Variables
var last_mousex = last_mousey = 0;
var mousex = mousey = 0;
var derW = derH = 0;
var mousedown = false;
//Canvas
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.drawStyle = "black";
ctx.lineWidth = 1;
ctx.globalCompositeOperation = 'xor';
// Fond
var monimage = new Image();
monimage.src = "./albums/une_photo.jpg";
ctx.drawImage(monimage, 0, 0, 1000, 700);
//Mousedown
$(canvas).on('mousedown', function(e) {
last_mousex = parseInt(e.pageX);
last_mousey = parseInt(e.pageY);
mousedown = true;
});
//Mouseup
$(canvas).on('mouseup', function(e) {
mousedown = false;
});
//Mousemove
$(canvas).on('mousemove', function(e) {
mousex = parseInt(e.pageX);
mousey = parseInt(e.pageY);
if (mousedown) {
var width = mousex-last_mousex;
var height = mousey-last_mousey;
ctx.strokeRect(last_mousex, last_mousey, derW, derH);
derW = width;
derH = height;
ctx.strokeRect(last_mousex, last_mousey, width, height);
}
//Output
$('#output').html('current: '+mousex+', '+mousey+' last: '+last_mousex+', '+last_mousey+' mousedown: '+mousedown); });
});
</script>
Ce code ne me donne pas satisfaction !
Mon idée est, utilisant les événements souris, de tracer sur le fond du canvas par strokeRect, des rectangles au fur et à mesure du déplacement de la souris, événement mousemove.
Avec globalCompositeOperation = 'xor', je pense que deux tracés consécutifs du même rectangle devraient s'annuler, laissant réapparaître l'image de fond.
Ce n'est hélas pas ce qui se passe, comme si le xor ne fonctionnait pas ?
Merci de m'avoir lu jusqu'à ce point, et merci si vous avez une idée pour venir à mon aide.
Bien cordialement.
Yves
Modifié par goggi (10 Oct 2022 - 10:25)