1. 程式人生 > >actionscript3.0 圖片裁剪及儲存jpg詳解

actionscript3.0 圖片裁剪及儲存jpg詳解

-
-
 
DIY部落社群最新活動:
[java]一個java技術性的問題
[java]java基礎程式設計 懸賞100分
[作業系統]你覺的Windows哪個系統好?
2009.8.27-9.27日活動
[java]MP3可以做什麼用
發起論壇活動請點選這裡

--------------------------------------------------------------------------------
1. 客戶端生成BitmapData 物件。
2. 用JPGEncoder 對其編碼相應的位元組陣列
3 用URLRequest和URLLoader傳送資料。
4.服務用request.getInputStream()接收流..
5.儲存為圖片格式。

package
...{
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.events.* ;
    import flash.display.*;
    import flash.geom.* ;
    import flash.net.*;
    import flash.utils.ByteArray;
     
    import com.wdxc.util.* ;  
       
   
    public class Main extends Sprite
    ...{
        private var _picx:int = 0 ;
        private var _picy:int = 120 ; 
        private var _picwidth = 0 ;
        private var _picheight = 0 ;
         
        private var _bitmapdata:BitmapData ;
     
 
        private var _rect:Sprite ;//裁剪區域    
       
        private var _url:String ="

http://192.168.0.211/test.jsp";
   
        public function Main():void...{    
            this.loadPic("F:\a.jpg"); 
            this.init();
            
        }     
        
        public function init():void ...{
            cut_btn.addEventListener(MouseEvent.MOUSE_DOWN, grabPic);
            save_btn.addEventListener(MouseEvent.MOUSE_DOWN, savePic) ;
        }

          
        /** *//****
         * 裝載圖片
         * @param    picurl 
         */  
        public function loadPic(picurl:String):void...{
            if (picurl == null || picurl == "")
            ...{
                return ;   
            }
            var request:URLRequest = new URLRequest(picurl);
            var loader:Loader = new Loader() ;
            loader.load(request);
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHander);
               
        }
       
        /** *//** 
         * 對圖片編碼並提交給服務端儲存。
         * @param bitmapdata 圖片資料 
         */      
        public function submit(bitmapdata:BitmapData):void ...{
                
            //每次URL不同,AS3才會提交每一次,否則將不提交。
            var url :String = _url+"?"+Math.floor(Math.random()*1000) ; 
            var request:URLRequest = new URLRequest(url); 
            
            //編碼成圖片格式流
            var encoder:JPGEncoder = new JPGEncoder(80);
            var bytes:ByteArray = encoder.encode(bitmapdata);     
           
            request.method = URLRequestMethod.POST;
            request.data = bytes ;  
                   
            //設定成檔案流形式
            request.contentType = "application/octet-stream";

            var loader:URLLoader = new URLLoader();                 
            loader.load(request) ;       
            loader.addEventListener(Event.COMPLETE, sendCompleteHandler) ; 
        }
           
        /** *//**
         * 服務端儲存完回撥
         * @param    e
         */
        private function sendCompleteHandler(e:Event):void ...{
            trace("save success........");    
        } 
         
        /** *//**
         * 儲存裁剪圖片
         * @param    e
         */
        private function savePic(e:MouseEvent)...{
            
            //組裝要裁剪區域   
            var cutpic:Rectangle = new Rectangle(_rect.x,_rect.y,_rect.width,_rect.height);
            var bitmapdata:BitmapData = this.getCutData(_bitmapdata, cutpic); 
           
            var bitmap:Bitmap = new Bitmap(bitmapdata) ;          
            bitmap.x = 100 ;
            bitmap.y = 0 ; 
            //只顯示裁剪區域圖片,去除其他空位置 
            this.addChild(bitmap);   
            this.submit(cutbitmapdata);      
        }  
         
        /** *//**  
         * 獲取所裁剪區域的資料。所有畫素資訊
         * @param source        源圖資料  
         * @param rect          所有裁剪的區域    
         * @return BitmapData   裁剪出新圖的資料
         */
        public function getCutData(source:BitmapData,rect:Rectangle):BitmapData ...{
            //存放裁剪出的新圖片
            var cutbitmapdata:BitmapData = new BitmapData(Math.floor(_rect.width),Math.ceil(_rect.height)) ;
                  
            //座標轉化,把座標移到裁剪區域的位置,寬度和高度在cutbitmapdata裡指定。
            var matrix:Matrix = new Matrix(1, 0, 0, 1, -Math.floor(_rect.x), -Math.floor(_rect.y));
            
            cutbitmapdata.draw(_bitmapdata, matrix); 
            return cutbitmapdata ; 
        }
       

        /** *//**** 
         * 裝載圖片完成之後,顯示圖片到場景
         * @param    e
         */
        private function completeHander(e:Event):void ...{
            var loader:Loader = e.target.loader as Loader;
              
            this._picwidth = loader.width ;
            this._picheight = loader.height ;     
            _bitmapdata= new BitmapData(loader.width, loader.height);
            _bitmapdata.draw(loader);
            var _bitmap:Bitmap = new Bitmap(_bitmapdata);       
            _bitmap.x = this._picx;
            _bitmap.y = this._picy ;
            this.addChild(_bitmap);
        }
       
        /** *//****     
         * 生成裁剪區域框,用來抓起圖片
         * @param    e    
         */   
        private function grabPic(e:MouseEvent):void
        ...{
          
            _rect= new Sprite () ;
           
            /** *//***設定裁剪區域邊框樣式*/
            _rect.graphics.lineStyle(3, 0xFF0000, 0.5, true, LineScaleMode.NONE, CapsStyle.ROUND);
            _rect.graphics.beginFill(0xCCFF00,0);  
            _rect.graphics.drawRect(this._picx, this._picy, this._picwidth/4,this._picheight/4);
            _rect.graphics.endFill(); 
            _rect.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler) ;
            _rect.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandle) ;
            this.addChild(_rect) ;        
        }
        
        /** *//**
         * 滑鼠控制裁剪區域,可拖動,拉伸。
         * @param    e
         */
        private function mouseDownHandler(e:MouseEvent):void ...{
            
            //裁剪區域移動範圍,不能超過原圖區域。
            var _rectangle:Rectangle = new Rectangle();
            _rectangle.width = _picwidth-_rect.width ;
            _rectangle.height = _picheight-_rect.height ;      
            _rect.startDrag(false,_rectangle);            
        }
        
        private function mouseUpHandle(e:MouseEvent):void ...{
            _rect.stopDrag();
        }
    }
}
 
服務端處理程式碼


<%
   
    String filePath = request.getRealPath(System.currentTimeMillis()+".jpg");
    System.out.print("filepath=="+filePath);
    BufferedInputStream inputStream = new BufferedInputStream(request.getInputStream());
    FileOutputStream outputStream = new FileOutputStream(new File(filePath));
    byte [] bytes = new byte[1024];
   
    int v;
    while((v=inputStream.read(bytes))>0){
        outputStream.write(bytes,0,v);
    }
    outputStream.close();
    inputStream.close();
%>