質問

画像(mx)があり、クリックされたピクセルの単位を取得したいです。

何か案は?

役に立ちましたか?

解決

ここではさらに単純な実装を示します。あなたがすることは、を使用してステージのスナップショットを撮ることだけです。 描く() 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 これはメモリの問題を避けるために不可欠です。

注記:カスタム カーソル スプライトを使用している場合は、「state」以外のオブジェクトを使用する必要があります。そうしないと、その下の色の代わりにカスタム スプライトの色をサンプリングすることになります。

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 ページ 必要な場所へ連れて行ってくれます。画像を Bitmap 変数にロードすると、その BitmapData プロパティにアクセスできるようになります。追加 マウスクリックイベント 画像をリスナーして使用します ビットマップデータ::getPixel. 。getPixel の例は、uint 応答を RGB 16 進コードに変換する方法を示しています。

これは、私にとってうまく機能した 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 または 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 に接続して即座に視覚的なフィードバックを得るのに十分な速度が必要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top