2008-09-17 11 views

答えて

8

はここでも単純な実装です: -

はここ(YMMVをmxmlcを使用して)私のために働いたのBitmapDataページに与えられた例の修正です。あなたは、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); 
} 
+0

私はあなたを殺すつもりです!!!!!!!!!!! 誰でも見る理由はありますか?;-) ヒント:使用する前に常にstackoverflowコードをチェックしてください:-) –

+0

私はいくつかの簡単な境界をチェックして、あなたのx yはステージ領域の外側にある。 –

+1

1つのピクセル値を取得するためにステージ全体を描画する必要はありません。 BitmapDataを1x1にして、その描画呼び出しに行列とclipRectを渡します。 – darscan

10

BitmapData LiveDoc Pageで数分で移動する必要があります。 Bitmap変数に画像を読み込んだらBitmapDataプロパティにアクセスできます。画像にMouse Click Eventリスナーを追加し、BitmapData::getPixelを使用します。 getPixelの例は、uint応答をrgbの16進コードに変換する方法を示しています。

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

これは、FlexまたはMX固有ではありません

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にフックアップするのに十分な高速である必要があります。

+1

IMOこれは間違いなく原因、それはステージ全体を描画し、より正確に質問に答えるないという事実にも優れ答えです。 – Allar

関連する問題