?
??最近要把一个单机软件简单的绘图功能放到WEB上,考虑常识了诸多方案,如果是单纯的保存图片再简单不过了,但绘制的数据要记录,要与服务器交互,绘制逻辑比较复杂,用AJAX在交互及业务上会相当大的工作量;自定义控件在交互和效率上也没任何优势。无奈最终还是觉得FLASH要好的多。
??Flash绘图比较简单,但本身不支持JPG等格式编码,需要FLEX的库,无奈不想搞的太复杂,只能用第三方封装的库'?com.adobe.images.JPGEncoder':
?
https://github.com/mikechambers/as3corelib/downloads
?
Flash代码:?
import?flash.display.BitmapData;
//引用第三方库
import?com.adobe.images.JPGEncoder;
stop();
//保存按腻
btn_save.addEventListener(MouseEvent.CLICK,?bt_save_event);
function?bt_save_event(event:MouseEvent)?:?void{
????????????doSave();
????????????return;
}//?end?function
function?doSave(){
?
//从MC获取位图
?var?jpgSource:BitmapData?=?new?BitmapData?(mc_test.width,?mc_test.height);
?jpgSource.draw(mc_test);
?var?jpgEncoder:JPGEncoder?=?new?JPGEncoder(85);
?var?jpgStream:ByteArray?=?jpgEncoder.encode(jpgSource);
//保存在客户端
?//var?file:FileReference?=?new?FileReference();
?//file.save(jpgStream,"test.jpg");
?
//请求服务器
?var?jpgURLRequest:URLRequest?=?new?URLRequest("ScreenSplitHandler.ashx");?
//HTTP头
?var?header:URLRequestHeader?=?new?URLRequestHeader("Content-type",?"application/octet-stream");???
?var?_loader:URLLoader?=?new?URLLoader();
?jpgURLRequest.requestHeaders.push(header);???
?jpgURLRequest.method?=?URLRequestMethod.POST;???
?jpgURLRequest.data?=?jpgStream;???
_loader.addEventListener(Event.COMPLETE,completeHandler);?
_loader.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);?
_loader.load(jpgURLRequest);?
}
function?completeHandler(evt:Event):void?{?
?txt_msg.text?=?"成功";?
?trace(URLLoader(e.target).data?);//
}?
function?ioErrorHandler(evt:IOErrorEvent):void?{?
?txt_msg.text?=?"失败";?
?}?
?
Asp.net代码:
?
?这里用了ashx文件,只帖核心代码:
?
????????????context.Response.ClearContent();
//响应输出类型(用于FLASH接收返回)
????????????context.Response.ContentType?=?"text/plain";
//这里看到网上有些使用的是第三方库来接收的,因为C#没有bytearray,实际上bytearray就是byte[]啊--!
????????????byte[]?_bmp?=?context.Request.BinaryRead(context.Request.ContentLength);
????????????MemoryStream?ms?=?new?MemoryStream(_bmp);
????????????System.Drawing.Image?img?=?Bitmap.FromStream(ms);
????????????Bitmap?bmp?=?new?Bitmap(img);
????????????MemoryStream?tempStream?=?new?MemoryStream();
????????????bmp.Save(tempStream,?ImageFormat.Jpeg);
????????????FileStream?fs?=?new?FileStream("test.jpg",?FileMode.Create);
????????????tempStream.WriteTo(fs);
????????????tempStream.Close();
????????????tempStream.Dispose();
????????????fs.Close();
????????????fs.Dispose();
?
以上。