actionscript3.0 图片裁剪及保存jpg详解

出处:http://hereson.javaeye.com/blog/198139

1. 客户端生成BitmapData 对象。
2. 用JPGEncoder 对其编码相应的字节数组
3 用URLRequest和URLLoader发送数据。
4.服务用request.getInputStream()接收流..
5.保存为图片格式。

  1 package 
  2 ...{
  3     import flash.geom.Point;
  4     import flash.geom.Rectangle;
  5     import flash.net.URLLoader;
  6     import flash.net.URLRequest;
  7     import flash.events.* ;
  8     import flash.display.*;
  9     import flash.geom.* ;
 10     import flash.net.*;
 11     import flash.utils.ByteArray;
 12       
 13     import com.wdxc.util.* ;   
 14         
 15     
 16     public class Main extends Sprite
 17     ...{
 18         private var _picx:int = 0 ;
 19         private var _picy:int = 120 ;  
 20         private var _picwidth = 0 ; 
 21         private var _picheight = 0 ;
 22           
 23         private var _bitmapdata:BitmapData ;
 24       
 25   
 26         private var _rect:Sprite ;//裁剪区域     
 27         
 28         private var _url:String ="http://192.168.0.211/test.jsp"; 
 29     
 30         public function Main():void...{     
 31             this.loadPic("F:a.jpg");  
 32             this.init();
 33              
 34         }      
 35          
 36         public function init():void ...{
 37             cut_btn.addEventListener(MouseEvent.MOUSE_DOWN, grabPic);
 38             save_btn.addEventListener(MouseEvent.MOUSE_DOWN, savePic) ;
 39         }
 40 
 41            
 42         /** *//****
 43          * 装载图片
 44          * @param    picurl  
 45          */   
 46         public function loadPic(picurl:String):void...{
 47             if (picurl == null || picurl == "") 
 48             ...{
 49                 return ;    
 50             } 
 51             var request:URLRequest = new URLRequest(picurl);
 52             var loader:Loader = new Loader() ; 
 53             loader.load(request);
 54             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHander);
 55                 
 56         } 
 57         
 58         /** *//**  
 59          * 对图片编码并提交给服务端保存。
 60          * @param bitmapdata 图片数据  
 61          */       
 62         public function submit(bitmapdata:BitmapData):void ...{ 
 63                  
 64             //每次URL不同,AS3才会提交每一次,否则将不提交。
 65             var url :String = _url+"?"+Math.floor(Math.random()*1000) ;  
 66             var request:URLRequest = new URLRequest(url);  
 67              
 68             //编码成图片格式流
 69             var encoder:JPGEncoder = new JPGEncoder(80); 
 70             var bytes:ByteArray = encoder.encode(bitmapdata);      
 71             
 72             request.method = URLRequestMethod.POST; 
 73             request.data = bytes ;   
 74                     
 75             //设置成文件流形式
 76             request.contentType = "application/octet-stream"; 
 77 
 78             var loader:URLLoader = new URLLoader();                  
 79             loader.load(request) ;        
 80             loader.addEventListener(Event.COMPLETE, sendCompleteHandler) ;  
 81         }
 82             
 83         /** *//** 
 84          * 服务端保存完回调
 85          * @param    e 
 86          */
 87         private function sendCompleteHandler(e:Event):void ...{
 88             trace("save success........");     
 89         }  
 90           
 91         /** *//** 
 92          * 保存裁剪图片
 93          * @param    e
 94          */
 95         private function savePic(e:MouseEvent)...{
 96              
 97             //组装要裁剪区域    
 98             var cutpic:Rectangle = new Rectangle(_rect.x,_rect.y,_rect.width,_rect.height); 
 99             var bitmapdata:BitmapData = this.getCutData(_bitmapdata, cutpic);  
100             
101             var bitmap:Bitmap = new Bitmap(bitmapdata) ;           
102             bitmap.x = 100 ; 
103             bitmap.y = 0 ;  
104             //只显示裁剪区域图片,去除其他空位置  
105             this.addChild(bitmap);    
106             this.submit(cutbitmapdata);       
107         }   
108           
109         /** *//**   
110          * 获取所裁剪区域的数据。所有像素信息 
111          * @param source        源图数据   
112          * @param rect          所有裁剪的区域     
113          * @return BitmapData   裁剪出新图的数据
114          */ 
115         public function getCutData(source:BitmapData,rect:Rectangle):BitmapData ...{
116             //存放裁剪出的新图片 
117             var cutbitmapdata:BitmapData = new BitmapData(Math.floor(_rect.width),Math.ceil(_rect.height)) ;
118                    
119             //坐标转化,把坐标移到裁剪区域的位置,宽度和高度在cutbitmapdata里指定。
120             var matrix:Matrix = new Matrix(1, 0, 0, 1, -Math.floor(_rect.x), -Math.floor(_rect.y));
121              
122             cutbitmapdata.draw(_bitmapdata, matrix);  
123             return cutbitmapdata ;  
124         } 
125         
126 
127 
128 
129         /** *//****  
130          * 装载图片完成之后,显示图片到场景
131          * @param    e
132          */ 
133         private function completeHander(e:Event):void ...{
134             var loader:Loader = e.target.loader as Loader;
135                
136             this._picwidth = loader.width ;
137             this._picheight = loader.height ;      
138             _bitmapdata= new BitmapData(loader.width, loader.height);
139             _bitmapdata.draw(loader);
140             var _bitmap:Bitmap = new Bitmap(_bitmapdata);        
141             _bitmap.x = this._picx;
142             _bitmap.y = this._picy ;
143             this.addChild(_bitmap); 
144         } 
145         
146         /** *//****      
147          * 生成裁剪区域框,用来抓起图片
148          * @param    e     
149          */    
150         private function grabPic(e:MouseEvent):void 
151         ...{
152            
153             _rect= new Sprite () ; 
154             
155             /** *//***设置裁剪区域边框样式*/
156             _rect.graphics.lineStyle(3, 0xFF0000, 0.5, true, LineScaleMode.NONE, CapsStyle.ROUND);
157             _rect.graphics.beginFill(0xCCFF00,0);   
158             _rect.graphics.drawRect(this._picx, this._picy, this._picwidth/4,this._picheight/4);
159             _rect.graphics.endFill();  
160             _rect.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler) ;
161             _rect.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandle) ;
162             this.addChild(_rect) ;         
163         } 
164          
165         /** *//** 
166          * 鼠标控制裁剪区域,可拖动,拉伸。
167          * @param    e
168          */
169         private function mouseDownHandler(e:MouseEvent):void ...{ 
170              
171             //裁剪区域移动范围,不能超过原图区域。
172             var _rectangle:Rectangle = new Rectangle();
173             _rectangle.width = _picwidth-_rect.width ; 
174             _rectangle.height = _picheight-_rect.height ;       
175             _rect.startDrag(false,_rectangle);             
176         } 
177          
178         private function mouseUpHandle(e:MouseEvent):void ...{
179             _rect.stopDrag(); 
180         }
181     } 
182 }


 
服务端处理代码

<% 
    
    String filePath = request.getRealPath(System.currentTimeMillis()+".jpg");
    System.out.print("filepath=="+filePath); 
    BufferedInputStream inputStream = new BufferedInputStream(request.getInputStream());
    FileOutputStream utputStream = 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();
%>
原文地址:https://www.cnblogs.com/ztdy/p/3617004.html