3.0

2010-06-01 8 views
1

내 문제는 이것이다 ActionScript에서 다른 이미지로 이미지를 마스크하는 방법, 내 사용자는 의 FileReference로 이미지를 가져 와서 나는 그것을 마스크 한 후 서버로 전송해야합니다.3.0

내 문제는 이것이다 : 내 캔버스로는 FileReference 이벤트 및 전송 이미지 데이터를 보관하지 할 수 있어요. 서버 에 마스킹 결과를 보낼 수 있습니다.

하지만 내 사용자가 내 캔버스에 부하를 가지고 있다는 이미지를 마스크 할 수 아니에요.

어떤 도움/예를 들어이있다?

감사 니콜라

답변

0

당신은 용기 (예를 들어 스프라이트를) 마스크 가능하도록로드 된 비트 맵을 추가해야합니다. exmaple의 경우 : Test.as

package { 
import flash.display.Graphics; 
import flash.display.Loader; 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.events.MouseEvent; 
import flash.net.FileFilter; 
import flash.net.FileReference; 

public class Test extends Sprite { 

    private var _fileReference:FileReference; 
    private var _fileFilter:FileFilter; 
    private var _loader:Loader; 
    private var _imageContainer:Sprite; 
    private var _mask:Sprite; 
    private var _canvas:Sprite; 

    public function Test() { 
     addEventListener(Event.ADDED_TO_STAGE, addedToStageListener, false, 0, true); 
    } 

    private function addedToStageListener(event:Event):void { 
     removeEventListener(Event.ADDED_TO_STAGE, addedToStageListener); 

     _fileReference = new FileReference(); 
     _fileReference.addEventListener(Event.SELECT, fileSelectedListener, false, 0, true); 
     _fileReference.addEventListener(Event.COMPLETE, fileLoadCompleteListener, false, 0, true); 

     _fileFilter = new FileFilter("Images", "*.jpg;*.gif;*.png"); 

     _loader = new Loader(); 
     _canvas = new Sprite(); 

     _mask = new Sprite(); 
     var maskGraphics:Graphics = _mask.graphics; 
     maskGraphics.beginFill(0xFFFFFF); 
     maskGraphics.drawCircle(50, 50, 50); 
     maskGraphics.endFill(); 

     _imageContainer = new Sprite(); 
     _imageContainer.mask = _mask; 

     _canvas.addChild(_imageContainer); 
     _canvas.addChild(_mask); 

     addChild(_canvas); 

     stage.addEventListener(MouseEvent.CLICK, mouseClickListener, false ,0, true); 
    } 

    private function mouseClickListener(event:Event):void { 
     _fileReference.browse([_fileFilter]); 
    } 

    private function fileSelectedListener(event:Event):void { 
     _fileReference.load(); 
    } 

    private function fileLoadCompleteListener(event:Event):void { 
     _loader.loadBytes(event.target.data); 

     while(_imageContainer.numChildren) { 
      _imageContainer.removeChildAt(0); 
     } 
     _imageContainer.addChild(_loader); 
    } 
}} 
+0

정말 고마워요은 ... 당신의 예제는 나에게 매우 유용합니다,하지만, 마스크 정보를 이미지가있는 경우, 예를 들어이 http://yfrog.com/5amaskblackp; 어떻게이 이미지를 _mask와 통합 할 수 있습니까? 고마워 니콜라. – Nicola

0

이 아니라 극적으로 상황을 변경합니다. 수정 된 솔루션을 확인하십시오 :

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.geom.Point; 
import flash.geom.Rectangle; 
import flash.net.FileFilter; 
import flash.net.FileReference; 

public class Test extends Sprite { 

    private var _fileReference:FileReference; 
    private var _fileFilter:FileFilter; 
    private var _imageLoader:Loader; 
    private var _maskLoader:Loader; 
    private var _canvas:Sprite; 

    private var _imageLoaded:Boolean = false; 

    public function Test() { 
     addEventListener(Event.ADDED_TO_STAGE, addedToStageListener, false, 0, true); 
    } 

    private function addedToStageListener(event:Event):void { 
     removeEventListener(Event.ADDED_TO_STAGE, addedToStageListener); 

     _fileReference = new FileReference(); 
     _fileReference.addEventListener(Event.SELECT, fileSelectedListener, false, 0, true); 
     _fileReference.addEventListener(Event.COMPLETE, fileLoadCompleteListener, false, 0, true); 

     _fileFilter = new FileFilter("Images", "*.jpg;*.gif;*.png"); 

     _imageLoader = new Loader(); 
     _imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoadCompleteListener, false, 0, true); 
     _maskLoader = new Loader(); 
     _maskLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, maskLoadCompleteListener, false, 0, true); 

     _canvas = new Sprite(); 
     addChild(_canvas); 

     stage.addEventListener(MouseEvent.CLICK, mouseClickListener, false ,0, true); 
    } 

    private function mouseClickListener(event:Event):void { 
     _fileReference.browse([_fileFilter]); 
    } 

    private function fileSelectedListener(event:Event):void { 
     _fileReference.load(); 
    } 

    private function fileLoadCompleteListener(event:Event):void { 
     if (!_imageLoaded) { 
      _imageLoader.loadBytes(event.target.data); 
     } else { 
      _maskLoader.loadBytes(event.target.data); 
     } 
    } 

    private function imageLoadCompleteListener(event:Event):void { 
     _imageLoaded = true; 
    } 

    private function maskLoadCompleteListener(event:Event):void { 
     var imageBitmap:Bitmap = _imageLoader.content as Bitmap; 
     var maskBitmap:Bitmap = _maskLoader.content as Bitmap; 

     if (imageBitmap && maskBitmap) { 
      var imageBitmapData:BitmapData = imageBitmap.bitmapData; 
      var maskBitmapData:BitmapData = maskBitmap.bitmapData; 

      var boundRectange:Rectangle = new Rectangle(0, 0, maskBitmap.width, maskBitmap.height); 
      var destinationPoint:Point = new Point(0, 0); 

      var finalBitmapData:BitmapData = new BitmapData(maskBitmap.width, maskBitmap.height); 
      finalBitmapData.copyPixels(imageBitmapData, boundRectange, destinationPoint, maskBitmapData, destinationPoint); 
      var finalBitmap:Bitmap = new Bitmap(finalBitmapData); 

      while(_canvas.numChildren) { 
       _canvas.removeChildAt(0); 
      } 
      _canvas.addChild(finalBitmap); 
     } 
    } 
}} 

마스크 된 이미지를 선택할 수 있습니다. 두 번째 클릭은 마스킹 정보가 포함 된 이미지, (투명도 예를 들어, PNG 파일, like your image)을 선택할 수 있습니다. 희망이 도움이됩니다. 귀하의 빠른 회신