zoukankan      html  css  js  c++  java
  • 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();
    %>
  • 相关阅读:
    配置支持Basler的API函数的开发环境
    调用约定
    进程间通讯之 命名管道
    进程间通讯。
    使用结构体返回多个参数。
    目的:让目标程序在内存中只有一个实例
    数学问题
    机试二
    pycharm安装TensorFlow
    机器学习一
  • 原文地址:https://www.cnblogs.com/ztdy/p/3617004.html
Copyright © 2011-2022 走看看