У меня есть изображение (mx), и я хочу получить изображение пикселя, на который был щелкнул.Лучший способ получить цвет, где была нажата мышь в AS3
Любые идеи?
У меня есть изображение (mx), и я хочу получить изображение пикселя, на который был щелкнул.Лучший способ получить цвет, где была нажата мышь в AS3
Любые идеи?
Вот еще проще реализация. Все, что вы делаете, это сделать снимок сцены с использованием метода drawmapData draw(), затем используйте getPixel() на пиксель под мышью. Преимущество этого в том, что вы можете пробовать все, что было нарисовано на сцене, а не только определенное растровое изображение.
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));
}
Надеюсь, это полезно!
Edit:
Это сокращенная версия использует один BitmapData
и удаляет ненужный шаг создания Bitmap
. Если вы выбрали цвет на MOUSE_MOVE
, это необходимо для предотвращения проблем с памятью.
Примечание: если вы используете собственный спрайт курсора, вам придется использовать объект, отличный от «состояния», иначе вы будете выбирать цвет пользовательского спрайта вместо того, что находится под ним.
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);
}
Несколько минут на BitmapData LiveDoc Page доставят вас туда, куда вам нужно. После загрузки изображения в переменную Bitmap вы можете получить доступ к свойству BitmapData. Добавьте Mouse Click Event Слушатель изображения, а затем используйте BitmapData::getPixel. В примере для getPixel показано, как преобразовать ответ uint в шестнадцатеричный код rgb.
Вот модификация примера, приведенного на странице BitmapData, который работал для меня (с использованием 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));
}
}
}
Это не относится к Flex или ММ изображениям, и позволяет захватить значение цвета пиксела из любого растровой вытяжки объекта (при условии, у вас есть разрешение):
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);
}
Вы можете легко захватить пиксель со сцены или ваш экземпляр mx: Image. Это намного эффективнее, чем рисовать всю сцену (или вытачиваемый объект) и быть достаточно быстрым, чтобы подключиться к MouseEvent.MOUSE_MOVE для мгновенной визуальной обратной связи.
Я ЕСМЬ УБИТЬ ВАС !!!!!!!!!!! Может ли кто-нибудь увидеть, почему .... ;-) Совет: всегда используйте двойной код стекирования перед его использованием :-) – 2011-04-08 23:12:27
Я бы выбрал некоторые простые оценки, чтобы проверить правильность измерения, чтобы убедиться, что вы поймаете, когда ваш x и y находятся вне зоны сцены. – 2011-04-27 15:02:18