Domanda

Ho un'immagine (mx) e voglio ottenere l'unità del pixel su cui è stato fatto clic.

Qualche idea?

È stato utile?

Soluzione

Ecco un'implementazione ancora più semplice.Tutto quello che fai è scattare un'istantanea del palco utilizzando il file disegno() metodo di bitmapData, quindi utilizzare getPixel() sul pixel sotto il mouse.Il vantaggio è che puoi campionare tutto ciò che è stato disegnato sul palco, non solo una determinata 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));
}

Spero che questo sia utile!


Modificare:

Questa versione modificata utilizza un singolo BitmapData, e rimuove il passaggio non necessario della creazione di un file Bitmap.Se stai campionando il colore MOUSE_MOVE allora questo è essenziale per evitare problemi di memoria.

Nota:se stai usando uno sprite del cursore personalizzato dovrai usare un oggetto diverso da "state", altrimenti campionerai il colore dello sprite personalizzato invece di quello che c'è sotto.

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

Altri suggerimenti

Pochi minuti su Pagina BitmapData LiveDoc ti porterà dove devi andare.Una volta caricata l'immagine in una variabile Bitmap, puoi accedere alla sua proprietà BitmapData.Aggiungere un Evento clic del mouse Ascolta l'immagine e poi usala BitmapData::getPixel.L'esempio per getPixel mostra come convertire la risposta uint in un codice esadecimale rgb.

Ecco una modifica dell'esempio fornito nella pagina BitmapData che ha funzionato per me (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));
        }
    }
}

Questo non è specifico di Flex o mx:Image e ti consente di acquisire un valore di colore in pixel da qualsiasi oggetto disegnabile bitmap (a condizione che tu abbia il permesso):

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

Potresti facilmente prendere un pixel dallo stage o dalla tua istanza mx:Image.È molto più efficiente che disegnare l'intero stage (o un oggetto disegnabile) e dovrebbe essere abbastanza veloce da collegarsi a MouseEvent.MOUSE_MOVE per un feedback visivo immediato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top