2011-01-10 2 views
4

Hay, je suis en train d'écrire un simple concepteur d'images basé sur le web, et j'aimerais savoir si quelqu'un a une idée de la façon de mettre en œuvre un outil de lasso. J'aimerais pouvoir sauvegarder tous les points pour pouvoir les envoyer facilement à une base de données et les récupérer plus tard.Outil Lasso en javascript

Toutes les suggestions seraient super.

Répondre

6

En ce chercherais probablement plug-in de base, quelque chose comme ceci:

$.fn.extend({ 
    lasso: function() { 
    return this 
     .mousedown(function (e) { 
     // left mouse down switches on "capturing mode" 
     if (e.which === 1 && !$(this).is(".lassoRunning")) { 
      $(this).addClass("lassoRunning"); 
      $(this).data("lassoPoints", []); 
     } 
     }) 
     .mouseup(function (e) { 
     // left mouse up ends "capturing mode" + triggers "Done" event 
     if (e.which === 1 && $(this).is(".lassoRunning")) { 
      $(this).removeClass("lassoRunning"); 
      $(this).trigger("lassoDone", [$(this).data("lassoPoints")]); 
     } 
     }) 
     .mousemove(function (e) { 
     // mouse move captures co-ordinates + triggers "Point" event 
     if ($(this).hasClass(".lassoRunning")) { 
      var point = [e.offsetX, e.offsetY]; 
      $(this).data("lassoPoints").push(point); 
      $(this).trigger("lassoPoint", [point]); 
     } 
     }); 
    } 
}); 

plus tard, appliquer lasso() à tout élément et gérer les événements en conséquence:

$("#myImg") 
.lasso() 
.on("lassoDone", function(e, lassoPoints) { 
    // do something with lassoPoints 
}) 
.bind("lassoPoint", function(e, lassoPoint) { 
    // do something with lassoPoint 
}); 

lassoPoint sera un réseau de X, Y co-ordinat es. lassoPoints sera un tableau de lassoPoint.

Vous devriez probablement inclure une vérification supplémentaire pour un drapeau «lasso activé» dans le gestionnaire mousedown, afin que vous puissiez l'activer ou le désactiver indépendamment.

+1

Je pense que l'instruction 'if' dans le gestionnaire d'événement .mousemove devrait être - if ($ (this) .is (". LassoRunning")) { – user637563

+0

Absolument. Merci pour l'indice! – Tomalak

+1

Nice. J'utiliserais hasClass() au lieu de is() dans ce cas cependant :-). http://jsperf.com/jquery-hasclass-vs-is-performance/6 – 10basetom

2

Heres un plugin qui semble faire juste que http://odyniec.net/projects/imgareaselect/examples.html

Je ne l'ai pas utilisé.

Je ne l'ai jamais fait, mais si vous cherchez à faire votre propre, id imaginer qu'ils fonctionnent comme

onmousedown coords souris registre initial (ce qui est le coords du coin de la boîte) Lasso

onmousemove soustrait les nouvelles coordonnées des coordonnées initiales pour obtenir la largeur et la hauteur de div utilisées pour le lasso visuel.

onmouseup, arrêtez l'écoute mousemove, faire quelque chose avec coords et la dimension d'une boîte Lasso existante

+3

Je pense que l'OP cherche un lasso de forme libre plutôt qu'un rectangle rectangulaire. – casablanca

+0

@casablanca, cependant imgselectarea est un outil génial! – dotty

+0

J'ai fait un lasso de forme libre dans Adobe Flex auparavant pour la fonction de sélection d'image et la fonction d'impression. Les deux niches sont d'abord, vous devez utiliser "Winding Algorithm" pour décider de ces zones à l'intérieur quand vous avez fait le lasso et d'autre part, pour les fourmis marching sur le lasso de forme libre, vous pouvez utiliser une diagonale-45 degrés-parallèles Masque de délimitation du masque pour animer l'écoulement vers le haut/bas dans 45 degrés pour obtenir l'effet de fourmis. –

Questions connexes