Il s'agit en fait d'un problème très difficile (sur le plan mathématique), et je travaille presque sur la même chose. J'ai posé une question similaire sur Stackoverflow mais je n'ai pas obtenu de réponse, mais j'ai posté dans DocType (StackOverflow pour HTML/CSS) et j'ai obtenu une réponse. Consultez le site http://doctype.com/javascript-image-zoom-css3-transforms-calculate-origin-example
Je suis au milieu de la construction d'un plugin jQuery qui fait cela (zoom de style Google Maps utilisant des transformations CSS3). J'ai réussi à faire fonctionner le zoom sur le curseur de la souris, mais j'essaie encore de trouver comment permettre à l'utilisateur de faire glisser la toile comme on peut le faire dans Google Maps. Quand je l'aurai fait fonctionner, je posterai le code ici, mais regardez le lien ci-dessus pour la partie zoom à la souris.
Je n'avais pas réalisé qu'il y avait des méthodes d'échelle et de translation sur le contexte Canvas, vous pouvez réaliser la même chose en utilisant CSS3, par exemple en utilisant jQuery :
$('div.canvasContainer > canvas')
.css('-moz-transform', 'scale(1) translate(0px, 0px)')
.css('-webkit-transform', 'scale(1) translate(0px, 0px)')
.css('-o-transform', 'scale(1) translate(0px, 0px)')
.css('transform', 'scale(1) translate(0px, 0px)');
Veillez à définir le transform-origin CSS3 sur 0, 0 (-moz-transform-origin : 0 0). L'utilisation de la transformation CSS3 vous permet de zoomer sur n'importe quoi, assurez-vous simplement que le DIV conteneur est réglé sur overflow : hidden pour empêcher les bords zoomés de déborder sur les côtés.
C'est à vous de décider si vous utilisez les transformations CSS3 ou les méthodes d'échelle et de translation propres à canvas, mais consultez le lien ci-dessus pour les calculs.
Mise à jour : Meh ! Je vais simplement poster le code ici plutôt que de vous faire suivre un lien :
$(document).ready(function()
{
var scale = 1; // scale of the image
var xLast = 0; // last x location on the screen
var yLast = 0; // last y location on the screen
var xImage = 0; // last x location on the image
var yImage = 0; // last y location on the image
// if mousewheel is moved
$("#mosaicContainer").mousewheel(function(e, delta)
{
// find current location on screen
var xScreen = e.pageX - $(this).offset().left;
var yScreen = e.pageY - $(this).offset().top;
// find current location on the image at the current scale
xImage = xImage + ((xScreen - xLast) / scale);
yImage = yImage + ((yScreen - yLast) / scale);
// determine the new scale
if (delta > 0)
{
scale *= 2;
}
else
{
scale /= 2;
}
scale = scale < 1 ? 1 : (scale > 64 ? 64 : scale);
// determine the location on the screen at the new scale
var xNew = (xScreen - xImage) / scale;
var yNew = (yScreen - yImage) / scale;
// save the current screen location
xLast = xScreen;
yLast = yScreen;
// redraw
$(this).find('div').css('-moz-transform', 'scale(' + scale + ')' + 'translate(' + xNew + 'px, ' + yNew + 'px' + ')')
.css('-moz-transform-origin', xImage + 'px ' + yImage + 'px')
return false;
});
});
Vous devrez bien sûr l'adapter pour utiliser les méthodes d'échelle et de translation du canevas.
Mise à jour 2 : Je viens de remarquer que j'utilise transform-origin en même temps que translate. J'ai réussi à mettre en place une version qui n'utilise que scale et translate de manière indépendante, regardez-la ici. http://www.dominicpettifer.co.uk/Files/Mosaic/MosaicTest.html Attendez que les images soient téléchargées, puis utilisez la molette de votre souris pour zoomer. Vous pouvez également effectuer un panoramique en déplaçant l'image. Il utilise les transformations CSS3, mais vous devriez pouvoir utiliser les mêmes calculs pour votre Canvas.
2 votes
Je l'ai utilisé pour zoomer sur ma toile et cela fonctionne très bien ! La seule chose que je dois ajouter est que le calcul de la quantité de zoom n'est pas comme on pourrait s'y attendre. "var zoom = 1 + wheel/2 ;" c'est-à-dire que cela donne 1.5 pour le zoom avant et 0.5 pour le zoom arrière. J'ai modifié cela dans ma version de sorte que j'ai 1,5 pour le zoom avant et 1/1,5 pour le zoom arrière, ce qui rend la quantité de zoom avant et de zoom arrière égale. Ainsi, si vous faites un zoom avant et un zoom arrière, vous aurez la même image qu'avant le zoom.
2 votes
Notez que ceci ne fonctionne pas sur Firefox, mais la méthode peut facilement être appliquée à Plugin jQuery mousewheel . Merci de partager !
2 votes
Var zoom = Math.pow(1.5f, wheel) ; // Utilisez ceci pour calculer le zoom. L'avantage est qu'un zoom par roue=2 est identique à un zoom double par roue=1. En outre, un zoom avant de +2 et un zoom arrière de +2 rétablissent l'échelle originale.