أفضل طريقة للحصول على اللون الذي تم النقر فوقه بالماوس في AS3

StackOverflow https://stackoverflow.com/questions/78849

سؤال

لدي صورة (mx) وأريد الحصول على وحدة البكسل التي تم النقر عليها.

أيه أفكار؟

هل كانت مفيدة؟

المحلول

وهنا تنفيذ أبسط.كل ما عليك فعله هو التقاط لقطة للمسرح باستخدام يرسم() طريقة bitmapData، ثم استخدمها الحصول على بكسل () على بكسل تحت الماوس.وتتمثل ميزة ذلك في أنه يمكنك أخذ عينات من أي شيء تم رسمه على الجزء الرئيسي، وليس مجرد صورة نقطية معينة.

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

نصائح أخرى

بضع دقائق على صفحة 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));
        }
    }
}

هذا لا يقتصر على 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