2008-09-17 5 views

ответ

8

Вот еще проще реализация. Все, что вы делаете, это сделать снимок сцены с использованием метода drawmapData draw(), затем используйте 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)); 
} 

Надеюсь, это полезно!


Edit:

Это сокращенная версия использует один 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

Я ЕСМЬ УБИТЬ ВАС !!!!!!!!!!! Может ли кто-нибудь увидеть, почему .... ;-) Совет: всегда используйте двойной код стекирования перед его использованием :-) – 2011-04-08 23:12:27

+0

Я бы выбрал некоторые простые оценки, чтобы проверить правильность измерения, чтобы убедиться, что вы поймаете, когда ваш x и y находятся вне зоны сцены. – 2011-04-27 15:02:18

10

Несколько минут на BitmapData LiveDoc Page доставят вас туда, куда вам нужно. После загрузки изображения в переменную Bitmap вы можете получить доступ к свойству BitmapData. Добавьте Mouse Click Event Слушатель изображения, а затем используйте 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)); 
     } 
    } 
} 
8

Это не относится к Flex или ММ изображениям, и позволяет захватить значение цвета пиксела из любого растровой вытяжки объекта (при условии, у вас есть разрешение):

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 для мгновенной визуальной обратной связи.

Смежные вопросы