Frage

Ich habe ein Bild (mx), und ich will die Einheit des Pixels erhalten, die geklickt wurde.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Hier ist eine noch einfachere Implementierung. Alles, was Sie tun, ist eine Momentaufnahme der Bühne nehmen Sie die ziehen () Methode der bitmapdata verwenden, dann getPixel verwenden () auf dem Pixel unter der Maus. Der Vorteil dabei ist, dass man alles probieren kann, die auf die Bühne gezogen worden sind, nicht nur eine bestimmte Bitmap.

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));
}

Hope Dies ist hilfreich!


Bearbeiten :

Diese bearbeitete Version verwendet einen einzelnen BitmapData und entfernt den unnötigen Schritt einen Bitmap zu schaffen. Wenn Sie die Farbe auf MOUSE_MOVE sind Abtasten, dann ist dies wesentlich Speicherprobleme zu vermeiden.

. Hinweis: wenn Sie einen benutzerdefinierten Cursor Sprite verwenden werden Sie Sie ein anderes Objekt als ‚Staat‘ oder auch die Farbe des benutzerdefinierten Sprite werden Abtasten verwenden, um statt dessen, was unter ihm

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);
}

Andere Tipps

Ein paar Minuten auf der BitmapData- LiveDoc Seite werden Sie, wo Sie gehen müssen. Sobald Sie Ihr Bild in eine Bitmap-Variable geladen, können Sie seine BitmapData- Eigenschaft zugreifen. Fügen Sie einen Mouse Click-Ereignis Listener die Bild und verwenden Sie dann BitmapData- :: getPixel . Das Beispiel für getPixel zeigt, wie die uint Reaktion auf einen rgb Hex-Code zu konvertieren.

Hier ist eine Modifikation des Beispiels auf der BitmapData- Seite gegeben, die für mich gearbeitet (mit 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));
        }
    }
}

Dies ist nicht spezifisch für Flex oder mx: Bild, und ermöglicht es Ihnen, einen Pixelfarbwert aus einem beliebigen Bitmap ziehbar Objekt zu greifen (vorausgesetzt, Sie haben die Erlaubnis):

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);
}
Bild Beispiel:

Sie könnte leicht ein Pixel von der Bühne oder Ihre mx greifen. Es ist viel effizienter als die gesamte Bühne Zeichnung (oder ziehbar Objekt) und sollte schnell genug sein für sofortige visuelle Rückmeldung zu MouseEvent.MOUSE_MOVE anschließen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top