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

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

Любые идеи?


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


Ответы (3)


arrow_upward
8
arrow_downward

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

arrow_upward
10
arrow_downward

Несколько минут на 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

arrow_upward
8
arrow_downward

Это не относится к 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