AS3에서 마우스를 클릭한 색상을 얻는 가장 좋은 방법
-
09-06-2019 - |
문제
이미지(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에 연결할 수 있을 만큼 충분히 빨라야 합니다.