Meilleur moyen d'obtenir la couleur sur laquelle une souris a été cliquée dans AS3
-
09-06-2019 - |
Question
J'ai une image (mx) et je souhaite obtenir l'unité du pixel sur lequel l'utilisateur a cliqué.
Des idées?
La solution
Voici une implémentation encore plus simple. Tout ce que vous faites est de prendre un instantané de la scène à l'aide de la méthode draw () de bitmapData, puis d'utiliser getPixel () sur le pixel situé sous la souris. L'avantage est que vous pouvez échantillonner tout ce qui a été dessiné sur la scène, pas seulement un bitmap donné.
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;
stage.addEventListener(MouseEvent.CLICK, getColorSample);
function getColorSample(e:MouseEvent):void {
var bd:BitmapData = new BitmapData(stage.width, stage.height);
bd.draw(stage);
var b:Bitmap = new Bitmap(bd);
trace(b.bitmapData.getPixel(stage.mouseX,stage.mouseX));
}
J'espère que cela vous sera utile!
Modifier :
Cette version modifiée utilise un seul BitmapData ??code> et supprime l'étape inutile de création d'un
Bitmap
. Si vous échantillonnez la couleur sur MOUSE_MOVE
, cela est essentiel pour éviter les problèmes de mémoire.
Remarque: si vous utilisez une image-objet curseur personnalisée, vous devez utiliser un objet autre que "état", sinon vous échantillonnerez la couleur de l'image-objet personnalisée au lieu de ce qu'il y a en dessous.
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.*;
private var _stageBitmap:BitmapData;
stage.addEventListener(MouseEvent.CLICK, getColorSample);
function getColorSample(e:MouseEvent):void
{
if (_stageBitmap == null) {
_stageBitmap = new BitmapData(stage.width, stage.height);
}
_stageBitmap.draw(stage);
var rgb:uint = _stageBitmap.getPixel(stage.mouseX,stage.mouseY);
var red:int = (rgb >> 16 & 0xff);
var green:int = (rgb >> 8 & 0xff);
var blue:int = (rgb & 0xff);
trace(red + "," + green + "," + blue);
}
Autres conseils
Quelques minutes de la page Live BitDe BitmapData ??a > vous emmènera où vous devez aller. Une fois que votre image est chargée dans une variable Bitmap, vous pouvez accéder à sa propriété BitmapData. Ajoutez un événement de clic de souris à l'écoute de image, puis utilisez BitmapData :: getPixel . L'exemple de getPixel montre comment convertir la réponse uint en code hexadécimal rgb.
Voici une modification de l'exemple donné sur la page BitmapData qui a fonctionné pour moi (avec mxmlc - YMMV):
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
public class BitmapDataExample extends Sprite {
private var url:String = "santa-drunk1.jpg";
private var size:uint = 200;
private var image:Bitmap;
public function BitmapDataExample() {
configureAssets();
}
private function configureAssets():void {
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
var request:URLRequest = new URLRequest(url);
loader.load(request);
addChild(loader);
}
private function completeHandler(event:Event):void {
var loader:Loader = Loader(event.target.loader);
this.image = Bitmap(loader.content);
this.addEventListener(MouseEvent.CLICK, this.clickListener);
}
private function clickListener(event:MouseEvent):void {
var pixelValue:uint = this.image.bitmapData.getPixel(event.localX, event.localY)
trace(pixelValue.toString(16));
}
}
}
Ceci n'est pas spécifique à Flex ou mx: Image et vous permet de saisir une valeur de couleur de pixel à partir de n'importe quel objet dessiné bitmap (à condition que vous en ayez l'autorisation):
private const bitmapData:BitmapData = new BitmapData(1, 1);
private const matrix:Matrix = new Matrix();
private const clipRect:Rectangle = new Rectangle(0, 0, 1, 1);
public function getColor(drawable:IBitmapDrawable, x:Number, y:Number):uint
{
matrix.setTo(1, 0, 0, 1, -x, -y)
bitmapData.draw(drawable, matrix, null, null, clipRect);
return bitmapData.getPixel(0, 0);
}
Vous pouvez facilement saisir un pixel de la scène ou de votre instance mx: Image. C’est bien plus efficace que de dessiner l’ensemble de la scène (ou de l’objet dessinable) et il doit être assez rapide pour se connecter à MouseEvent.MOUSE_MOVE pour un retour visuel instantané.