簡體   English   中英

獲取在AS3中單擊鼠標的顏色的最佳方法

[英]Best way to get the color where a mouse was clicked in AS3

我有一個圖像(mx),我想得到點擊的像素的uint。

有任何想法嗎?

BitmapData LiveDoc頁面上的幾分鍾將帶您到達您需要的位置。 將圖像加載到Bitmap變量后,可以訪問其BitmapData屬性。 添加鼠標單擊事件偵聽器到圖像,然后使用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));
        }
    }
}

這是一個更簡單的實現。 您所做的就是使用bitmapData的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));
}

希望這有用!


編輯

此編輯版本使用單個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);
}

這不是特定於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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM