문제

이미지(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 그러면 이는 메모리 문제를 방지하는 데 필수적입니다.

메모:사용자 정의 커서 스프라이트를 사용하는 경우 '상태' 이외의 객체를 사용해야 합니다. 그렇지 않으면 그 아래에 있는 것이 아닌 사용자 정의 스프라이트의 색상을 샘플링하게 됩니다.

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

다른 팁

몇 분 동안 비트맵데이터 LiveDoc 페이지 당신이 가야 할 곳으로 데려다 줄 것입니다.이미지를 Bitmap 변수에 로드한 후에는 해당 BitmapData 속성에 액세스할 수 있습니다.을 추가하다 마우스 클릭 이벤트 이미지를 듣고 사용하십시오. BitmapData::getPixel.getPixel의 예는 단위 응답을 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