캠핑과 개발


flex에서 bitmap 관련 프로젝트를 진행하다가 결과물을 인쇄 또는 이미지로 저장을 하는 부분이 있어서 추후에도 이를 잊어버리지 않도록 간단한 예제와 함께 메모를 한다. 내용 샘플은 어떤 의미없는 비트맵 객체를 생성후 인쇄버튼과, 이미지 저장버튼을 누르게 되면 출력, 또는 이미지 파일로 저장이 된다. 여기에서 이미지 저장은 로컬 PC로 저장이 된다.
또 주석처리한 부분은 서버로 이미지를 저장할 경우 서버에서 이를 처리하기 위한 내용이다. 서버에서 이를 처리하기 위해서는 Server에서의 파일이 필요한데 이 부분은 첨부한 소스를 보면 된다.


예제화면

예제화면



source))

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
 creationComplete="init();"
 >
 <mx:Script>
  <![CDATA[
   import org.gif.encoder.GIFEncoder;
   import com.saeasoft.util.UploadPostHelper;
   import mx.collections.ArrayCollection;
   import mx.graphics.codec.PNGEncoder;
   import mx.graphics.codec.JPEGEncoder;
   import mx.graphics.codec.IImageEncoder;
   
   import mx.printing.FlexPrintJobScaleType;
   import mx.printing.PrintAdvancedDataGrid;
   import mx.printing.FlexPrintJob;
   
   private var imageType:String = "JPEG";
   
   private var imageTypeArray : ArrayCollection = new ArrayCollection([
    {label : "jpeg", data: 'jpeg'},
    {label : "png", data: 'png'},
    {label : "gif", data: 'gif'}
   ]);
   
   private var bitmapData:BitmapData;
   
   private function init():void{
    draw();
   }
   var bitmap:Bitmap;
   private function draw():void{
    var canvas:Sprite = new Sprite();
    var bitmapData:BitmapData = new BitmapData(500, 500, false, 0xffffffff);
    bitmap = new Bitmap(bitmapData);
    bitmapData.fillRect(new Rectangle(0,0,100,100), 0x000000);
    bitmapData.fillRect(new Rectangle(100,10,200,200), 0x000000);
    canvas.addChild(bitmap);
    content.addChild(canvas); 
   }
      
   private function saveImage():void
   {
    var imageEncoder:IImageEncoder;
    var gifImageEncoder : GIFEncoder;
    if(imageType.toUpperCase() == "JPEG") imageEncoder = new JPEGEncoder(); 
    else if(imageType.toUpperCase() == "PNG") imageEncoder = new PNGEncoder();
    else if(imageType.toUpperCase() == "GIF") gifImageEncoder = new GIFEncoder();
    var byteArray:ByteArray;
    if(imageType.toUpperCase() == "GIF" ){
     gifImageEncoder.start();
     gifImageEncoder.setRepeat(0);
     gifImageEncoder.addFrame(bitmap.bitmapData);
     gifImageEncoder.finish();
     byteArray = gifImageEncoder.stream;
    }else{
     byteArray = imageEncoder.encode(bitmap.bitmapData);
    }    
    var fileName:String = "desiredfilename." + imageType; //저장할 파일 이름이다. 아무거나 적자!
    
    byteArray.position=0;
    var fr:FileReference = new FileReference();
    fr.addEventListener(Event.COMPLETE, eventSaveComplete);
                fr.save(byteArray, fileName );
    /*
    var uploadPath:String = "/servlet/FlexUpload"
    var parameters:URLVariables = new URLVariables();
    parameters.method = "id";
    parameters.userId = "2000321";
    
    var urlRequest:URLRequest = new URLRequest();
    urlRequest.url = uploadPath;
    urlRequest.contentType = 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary();
    urlRequest.method = URLRequestMethod.POST;
    urlRequest.data = UploadPostHelper.getPostData(fileName, byteArray, null ,parameters);
    urlRequest.requestHeaders.push( new URLRequestHeader( 'Cache-Control', 'no-cache' ) );
    
    //var encoder : Base64Encoder = new Base64Encoder();
    var urlLoader:URLLoader = new URLLoader();
    urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
    urlLoader.addEventListener(Event.COMPLETE, onComplate);
    urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onError);
    urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
    urlLoader.load(urlRequest);
    */
   }
   
   private function eventSaveComplete(e:Event):void{
    trace("완료");
   }
   
   private function onComplate(e:Event):void{
    var loader:URLLoader = URLLoader(e.target);
    var bytedata:ByteArray = loader.data;
    var strData:String = bytedata.toString();
    trace( strData)
   }
   
   private function onError(e:ErrorEvent):void{
    trace('error');
   }
   
   /**
    * 페이지 인쇄
    **/
   private function printPage():void {
             var myPrintJob:PrintJob = new PrintJob();
             var options:PrintJobOptions = new PrintJobOptions();
             options.printAsBitmap = true;
             myPrintJob.start();
             try {
                 myPrintJob.addPage(content, null, options);
             }
             catch(e:Error) {
                 trace ("Had problem adding the page to print job: " + e);
             }
             try{
              myPrintJob.send();
             }catch (e:Error) {
                 trace ("Had problem printing: " + e);   
             }
         }
        
         private function changeImageTypeHandler(e:Event):void{
          imageType = ComboBox(e.target).selectedItem.data;
         }
  ]]>
 </mx:Script>
 <mx:Canvas width="100%" height="100%">
  <mx:UIComponent id="content" />
  <mx:ControlBar width="100%">
   <mx:Button label="print" click="printPage()"/>
   <mx:ComboBox id="imageCombo" dataProvider="{imageTypeArray}" change="changeImageTypeHandler(event)"/>
   <mx:Button label="image save" click="saveImage()"/>
  </mx:ControlBar>
 </mx:Canvas>
</mx:Application>

소스파일))