Лучший способ получить цвет в месте щелчка мышью в AS3

У меня есть изображение (mx), и я хочу получить uint пикселя, по которому щелкнули.

Любые идеи?


person Cameron A. Ellis    schedule 17.09.2008    source источник


Ответы (3)


Вот еще более простая реализация. Все, что вам нужно сделать, это сделать снимок сцены с помощью метода draw () для bitmapData, а затем использовать 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));
}

Надеюсь, это будет полезно!


Изменить:

В этой отредактированной версии используется единственный 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);
}
person defmeta    schedule 17.09.2008
comment
Я УБЬЮ ТЕБЯ !!!!!!!!!!! Кто-нибудь может понять почему .... ;-) Совет: всегда дважды проверяйте код stackoverflow перед его использованием :-) - person Simon_Weaver; 09.04.2011
comment
Я бы добавил несколько простых проверок границ, чтобы убедиться, что вы уловили, когда ваши x и y находятся за пределами рабочей области. - person Adam Smith; 27.04.2011
comment
Вам не нужно рисовать всю сцену только для того, чтобы получить значение одного пикселя. Сделайте BitmapData 1x1 и передайте матрицу и clipRect этому вызову отрисовки. - person darscan; 23.12.2011

Несколько минут на BitmapData LiveDoc Page займет вы туда, куда вам нужно идти. После загрузки изображения в переменную Bitmap вы можете получить доступ к его свойству BitmapData. Добавьте событие щелчка мыши в прослушиватель изображение, а затем используйте 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));
        }
    }
}
person enobrev    schedule 17.09.2008

Это не относится к Flex или mx: Image и позволяет вам получить значение цвета пикселя из любого рисованного объекта растрового изображения (при условии, что у вас есть разрешение):

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 для мгновенной визуальной обратной связи.

person darscan    schedule 23.12.2011
comment
ИМО, это определенно лучший ответ из-за того, что он не рисует весь этап и более точно отвечает на вопрос. - person Allar; 31.05.2012