2011-01-05 45 views
0

中以逆時針方向旋轉圖片的問題,我使用eventRotateHit函數向一個方向旋轉圖片:順時針旋轉圖片(+ 90°)。有用!在.swf對象中的Action Script 3

我需要創建一個逆時針(-90°)函數:eventRotateHit2。 此功能不起作用:圖片消失。 我認爲這是因爲旋轉中心是錯誤的,但我不確定。我不知道如何改變它。

你能幫助我嗎?

弗雷德裏克

我的代碼:

package Classes.image 

{ 
     import fl.controls.Button; 
     import flash.display.Bitmap; 
     import flash.display.MovieClip; 
     import Classes.utils.*; 
     import Classes.*; 
     import flash.events.*; 
     import flash.text.TextField; 
     import flash.text.StyleSheet; 
     import flash.utils.ByteArray; 
     import flash.display.BitmapData; 
     import com.adobe.images.JPGEncoder; 

     public class imgBox extends MovieClip 
     { 
       public var _img         : imgHelper; 
       private var _MAX_WIDTH       : Number; 
       private var _MAX_HEIGHT       : Number; 
       private var boxFrame:MovieClip; 
       private var statusMsg:TextField; 

       public var byteData:ByteArray; 

       public function imgBox(w:Number,h:Number,_bitmap:Bitmap) 
       { 
         _MAX_WIDTH = w; 
         _MAX_HEIGHT = h; 

         var borderColor:uint = 0x666666; 
         var borderSize:uint = 1; 
         var vMenu:verticalMenu; 

         _img = new imgHelper(_bitmap); 
         _img.addEventListener("invalidate", eventImageInvalidated); 
         if (_bitmap.width > _MAX_WIDTH || _bitmap.height > _MAX_HEIGHT) 
           _img.resizePic(_MAX_WIDTH, _MAX_HEIGHT, false); 

         boxFrame = new MovieClip; 
         boxFrame.graphics.lineStyle(borderSize, borderColor); 
         boxFrame.graphics.drawRect(0, 0, _img.width+4,_img.height+4); 
         addChild(boxFrame); 

         addChild(_img); 
         boxFrame.x = 60 + _img.theImage.x; 
         boxFrame.y = _img.theImage.y; 
         _img.x = 62; 
         _img.y = 2; 

         //vMenu = new verticalMenu(); 
         //var myMenu:Array = new Array({ label:'Rotate', _function:eventRotateHit });// , 
                     //  { label:'Upload', _function:eventUploadHit }); 
         //vMenu.buildMenu(myMenu); 

         var button:Button = new Button(); 
         button.label = Local.getInstance().getString("rotate"); 
         button.width = 50; 
         button.addEventListener(MouseEvent.CLICK, eventRotateHit); 
         addChild(button); 

         var buttonbis:Button = new Button(); 
         buttonbis.label = Local.getInstance().getString("rotate"); 
         buttonbis.width = 50; 
         buttonbis.y = 50; 
         buttonbis.addEventListener(MouseEvent.CLICK, eventRotateHit2); 
         addChild(buttonbis); 

       } 


       private function eventImageInvalidated(e:Event) { 
         e.stopImmediatePropagation(); 

         dispatchEvent(new Event("invalidate", true, true));// invalidate for re-encoding the image. 

       } 

       private function eventUploadHit(e:*) { 
         trace('Upload Hit'); 
         this.dispatchEvent(new Event("uploadImage")); 
       } 

       public function showStatus(msg:String) { 
           TweenLite.to(boxFrame, 0.5, { height: _img.height + 24 }); 
           var vMenu:verticalMenu = new verticalMenu();; 
           if (statusMsg){ 
             removeChild(statusMsg); 
             statusMsg = null; 
           } 
           statusMsg = new TextField(); 
           statusMsg.htmlText = msg; 
           statusMsg.styleSheet = vMenu._textStyleSheet; 
           statusMsg.width = _img.width; 
           addChild(statusMsg); 
           statusMsg.y = _img.height + 2; 
           statusMsg.x = boxFrame.x + 10; 

       } 

       public function hideStatus(msg:String = "") { 
           if (statusMsg){ 
             removeChild(statusMsg); 
             statusMsg = null; 
           } 
           TweenLite.to(boxFrame, 0.5, { height: _img.height + 4 }); 
       } 

       private function eventRotateHit(e:*) { 
         trace('rotate Image'); 
         if (statusMsg){ 
             removeChild(statusMsg); 
             statusMsg = null; 
           } 

         _img.rotate(Math.PI/2); 
         _img.resizePic(_MAX_WIDTH, _MAX_HEIGHT, false); 
         boxFrame.width = _img.width + 4; 
         boxFrame.height = _img.height + 4; 

         boxFrame.x = 60 + _img.theImage.x; 
         boxFrame.y = _img.theImage.y; 

       } 

       private function eventRotateHit2(e:*) { 
         trace('rotate Image'); 
         if (statusMsg){ 
             removeChild(statusMsg); 
             statusMsg = null; 
           } 

         _img.rotate((-1)*Math.PI/2); 
         _img.resizePic(_MAX_WIDTH, _MAX_HEIGHT, false); 
         boxFrame.width = _img.width + 4; 
         boxFrame.height = _img.height + 4; 

         boxFrame.x = 60 + _img.theImage.x; 
         boxFrame.y = _img.theImage.y;   

       } 

       public function dispose() { 

       } 

       public function prepare(w:Number, h:Number, q:Number) { 
         var btData:BitmapData = _img.resizeBitmapData(w, h); 
         byteData = new JPGEncoder(q).encode(btData); 

       } 

     } 

} 

這裏的旋轉功能:

package Classes.utils 
{ 
    import flash.display.Bitmap; 
    import flash.display.DisplayObject; 
    import flash.display.MovieClip; 
    import flash.net.*; 
    import flash.display.Loader; 
    import flash.events.*; 
    import flash.system.LoaderContext; 
    import flash.text.TextField; 
    import flash.geom.ColorTransform; 
    import flash.geom.Matrix; 
    import flash.display.BitmapData; 
    import Classes.*; 
    import flash.utils.ByteArray; 

    public class imgHelper extends MovieClip 
    { 
     public var tt:TextField; 
     public var theImage:Bitmap; 
     private var myMask:MovieClip; 


     private var _boxDimW:Number; 
     private var _boxDimH:Number; 




     public function imgHelper(img:Bitmap=null) 
     { 
      theImage = img; 
      if (theImage) 
       addChild(theImage); 
      tt = new TextField; 
      tt.text = '0%'; 
     /* addChild(tt);*/ 

     } 

     public override function get width():Number { 
      return theImage.width; 
     } 

     public override function get height():Number { 
      return theImage.height; 
     } 
     public function get _scaleX():Number { 
      return theImage.scaleX; 
     } 
     public function set _scaleX(sx) { 
      theImage.scaleX = sx; 
     } 

     public function get _scaleY():Number { 
      return theImage.scaleY; 
     } 
     public function set _scaleY(sy:Number) { 
      theImage.scaleY = sy; 
     } 

     public function load(url:String) 
     { 
      //trace('loading : ' + url); 
      var loader:Loader = new Loader(); 
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE, picLoaded); 
      loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, errLoading); 
      loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progress); 
      var lContext:LoaderContext = new LoaderContext(true); 



      var request:URLRequest = new URLRequest(url); 
      try { 
       loader.load(request,lContext); 


      } catch (error:Error) { 
       trace("Unable to load requested document."); 
      } 

     } 
     private function progress(e:ProgressEvent) 
     { 
      tt.text = Math.round(e.bytesLoaded /e.bytesTotal *100) + '%'; 
     } 

     private function errLoading(e:*) 
     { 
      tt.visible = false; 
      dispatchEvent(new Event("imgLoaded",true,true)); 
     } 

     private function picLoaded(e:*) 
     { 
      var picLoader:Loader = Loader(e.target.loader); 
      theImage = Bitmap(picLoader.content); 
      addChild(theImage); 

      tt.visible = false; 
      dispatchEvent(new Event("imgLoaded",true,true)); 
     } 

     public function resizePic(rW:Number,rH:Number,crop:Boolean=false) 
     { 
      var img = theImage; 
      _boxDimW = rW; 
      _boxDimH = rH; 

      if (img.width > img.height) 
      { 
       img.width = rW; 
       img.height = img.height * img.scaleX; 
      } 
      else 
      { 
       img.height = rH; 
       img.width = img.width * img.scaleY; 
      } 


      if (crop) 
      { 
       if (img.width < img.height) 
       { 
        var oldScaleX = img.scaleX; 
        img.width = rW; 
        img.scaleY += img.scaleX-oldScaleX; 

       } 
       else 
       { 
        var oldScaleY = img.scaleY; 
        img.height = rH; 
        img.scaleX += img.scaleY-oldScaleY; 

       } 

       maskIt(rW, rH); 

      } 
      else { 
       if (img.height < img.width) { 
        img.y=(rH-img.height)/2 
       } 
       else { 
        img.x=(rW-img.width)/2 

       } 
      } 



     } 



     public function resizeBitmapData (rW:Number, rH:Number):BitmapData { 
      var img:Bitmap = new Bitmap(theImage.bitmapData); 
      trace('resize bitmap : ' + img.height + '-' + img.width); 
      trace('resize bitmap : ' + rH + '-' + rW); 
      if (img.width > img.height) { 
        if (img.height>rH) 
         rH = img.height * (rW/img.width); 
        else{ // do not resize 
         rH = img.height; 
         rW = img.width; 
        } 
      } 
      else { 
       if (img.width>rW) 
        rW = img.width * (rH/img.height); 
       else{ // do not resize 
         rH = img.height; 
         rW = img.width; 
        } 

      } 

      var bmpData:BitmapData = new BitmapData(rW, rH); 
      var scaleMatrix:Matrix = new Matrix(rW/img.width , 0, 0, rH/img.height , 0,0); 
      var colorTransform:ColorTransform = new ColorTransform(); 
      bmpData.draw(theImage, scaleMatrix , colorTransform, null, null, true); 
      return (bmpData); 
     } 

     public function rotate(dir:Number) { 


      var workingImage:Bitmap = new Bitmap(theImage.bitmapData.clone()); 
      var bmpData:BitmapData = new BitmapData(workingImage.height, workingImage.width); 
      var transMatrix:Matrix = new Matrix(Math.cos(dir),Math.sin(dir),-Math.sin(dir),Math.cos(dir), workingImage.height,0); 
      var colorTransform:ColorTransform = new ColorTransform(); 
      bmpData.draw(workingImage, transMatrix, colorTransform, null, null, true); 
      TweenLite.to(theImage, 0.5, { autoAlpha:0 }); 
      //removeChild(theImage); 
      theImage = new Bitmap(bmpData); 
      addChild(theImage); 
      //trace(theImage.y + '--' + theImage.x+'--'+theImage.height+'--'+theImage.width); 
      if (theImage.height < theImage.width) { 
        theImage.y += (_boxDimH - theImage.height)/2 
       } 
       else { 
        theImage.x +=(_boxDimW-theImage.width)/2 

       } 


      theImage.alpha = 0; 
      TweenLite.to(theImage, 1, { autoAlpha:1 }); 
      trace('sending event !'); 
      dispatchEvent(new Event("invalidate", true, true));// invalidate for re-encoding the image. 
     } 


     public function maskIt(w:Number, h:Number) 
     { 
      if (myMask) { 
       removeChild(myMask); 
       myMask = null; 
      } 
      myMask = new MovieClip(); 
      myMask.graphics.beginFill(0xFFCC00); 
      myMask.graphics.drawRect(0, 0, w,h); 
      addChild(myMask); 
      this.mask = myMask; 
     } 

     public function dispose() { 

     } 

    } 

} 

感謝所有!

+1

似乎是從代碼段太長,不正確格式化沒有錯,你的功能,除了(你可能想使用{}按鈕)。恐怕我們無法幫助你,除非你澄清「不起作用」的含義,並將代碼發佈到imgHelper類的「旋轉」函數中。 – weltraumpirat 2011-01-05 09:46:08

+0

@ user563685:只是一個不相關的提示:而不是'_img.rotate(( - 1)* Math.PI/2);''你可以做'_img.rotate(Math.PI/-2);' – 2011-01-05 09:57:30

+0

@weltraumpirat謝謝你的評論:我添加旋轉功能和澄清 – 2011-01-05 10:19:08

回答

3

你的問題是在旋轉矩陣:

位圖圍繞其原點(0,0)旋轉,因此在90度,它位於可視區域的左邊。出於這個原因,你已經沿着X軸翻譯了原始圖像的高度 - 並且它可以工作。

現在,當您將圖像旋轉到270度(或-90度,正好相同)時,它位於可視區域的上方。所以,你現在必須由原始圖像的寬度,以沿y軸平移:

var dir:Number = Math.PI*1.5; // the same as 3*Math.PI/2 
var a:Number = Math.cos(dir); 
var b:Number = Math.sin(dir); 
var c:Number = -b; 
var d:Number = a; 
var transMatrix:Matrix = new Matrix(a,b,c,d,0,workingImage.width); 
+0

是的!!!!! !! 謝謝你這麼多!我明白我的錯誤,現在,它工作得很好!對不起,我不能投票,因爲我沒有任何聲望點。但是謝謝你! – 2011-01-05 12:36:31

+0

你可以接受這個答案,但是...;) – weltraumpirat 2011-01-05 12:51:06

+0

當然!完成! – 2011-01-05 13:55:37

-1

我認爲你需要短暫的輪換,這是一個尋找新方向的最短路線的公式。旋轉問題是,如果您旋轉(使用正常旋轉屬性)從0到-90,速度爲1,則需要(360-90 =)270步。短時間旋轉只需要90步(因爲大多數圓圈都是360度)。

我希望你這段代碼將有助於探索短輪伐期:

var startValue:int = targetMC.rotation = 0; 
    var endValue:int = -90; 
    var position:Number = 0; // should always be ratio betweeen 0-1 

    addEventListener(Event.ENTER_FRAME, update); 

    function update(e:Event=null):void 
    { 
     if (position < 1) 
     { 
     position += 0.05; 
     targetMC.rotation = startValue + (((endValue - startValue + 540) % 360) - 180) * position; 
     } 
    } 
+0

Thank你的答案...但是,我做了一個短暫的旋轉:Math.pi/-2是相同的,-90,沒有?我認爲我的問題是在旋轉功能,現在我不能完全重做:( – 2011-01-05 10:53:38

+0

-90是最終值,它可以是任何你想要旋轉的數字,我認爲它是在旋轉函數中,所以你需要實現像我在例子中使用的那個旋轉公式,希望有幫助。 – 2011-01-05 11:23:19

+0

他正在旋轉位圖像素,而不是旋轉DisplayObject – weltraumpirat 2011-01-05 11:40:38

相關問題