flex - lenguaje - La mejor forma de obtener el color donde se hizo clic en un mouse en AS3
as3 rpdr (3)
Unos minutos en la página LiveDoc de BitmapData lo llevarán a donde necesita ir. Una vez que haya cargado su imagen en una variable de mapa de bits, puede acceder a su propiedad BitmapData. Agregue un Escuchador de eventos de clic de mouse a la imagen y luego use BitmapData :: getPixel . El ejemplo de getPixel muestra cómo convertir la respuesta uint a un código hexadecimal rgb.
Aquí hay una modificación del ejemplo dado en la página BitmapData que funcionó para mí (usando 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));
}
}
}
Tengo una imagen (mx) y quiero obtener el reflejo del píxel en el que se hizo clic.
¿Algunas ideas?
Aquí hay una implementación aún más simple. Todo lo que debes hacer es tomar una instantánea del escenario usando el método draw () de bitmapData, luego usa getPixel () en el píxel debajo del mouse. La ventaja de esto es que puede muestrear todo lo que se ha dibujado en el escenario, no solo un mapa de bits dado.
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));
}
Espero que esto sea útil!
Editar :
Esta versión editada usa un único BitmapData
y elimina el paso innecesario de crear un Bitmap
. Si está muestreando el color en MOUSE_MOVE
, esto es esencial para evitar problemas de memoria.
Nota: si está utilizando un cursor de sprite personalizado, tendrá que usar un objeto que no sea ''state'', de lo contrario, estará muestreando el color del sprite personalizado en lugar de lo que hay debajo.
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);
}
Esto no es específico de Flex o mx: Image, y le permite tomar un valor de color de píxel de cualquier objeto dibujable de mapa de bits (siempre que tenga permiso):
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);
}
Puede tomar fácilmente un píxel del escenario o su mx: instancia de imagen. Es mucho más eficiente que dibujar todo el escenario (o un objeto dibujable), y debe ser lo suficientemente rápido como para conectarlo a MouseEvent.MOUSE_MOVE para obtener información visual instantánea.