出處:http://hereson.javaeye.com/blog/198139java
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 }
服務端處理代碼app
<% 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(); %>