2011-04-01 61 views
0

我想將組件保存爲JPG文件,我似乎無法獲得BitmapData.draw()給我所期望的像素,而當我打開結果時看到一個普通的白色矩形JPG文件。我首先創建一個包含圖像和標題(下面的MultigraphCanvas)的對象,並且當我將對象顯示爲彈出對象時,它看起來很完美 - 但是,當我嘗試將其繪製爲位圖並將其編碼並保存爲一張JPG我不會以我可以在屏幕上顯示的相同圖像結束。下面的代碼:Flex BitmapData.draw()只繪製一個白色矩形 - 我可以繪製顯示對象的所有元素嗎?

 private function saveAsFile(title:String):void 
     { 
      // make a canvas containing the multigraph and title 
      var multigraphCanvas:MultigraphCanvas = new MultigraphCanvas(); 
      multigraphCanvas.initialize(); 
      multigraphCanvas.multigraphGroup = multigraphGroup; 
      multigraphCanvas.titleText.text = title; 

      this.addElement(multigraphCanvas); 

      var matrix:Matrix = new Matrix() 
      matrix.tx = 0; 
      matrix.ty = 0; 
      var multigraphCanvasBitmapData:BitmapData = new BitmapData(multigraphCanvas.width, multigraphCanvas.height, true, 0xffffffff); 
      multigraphCanvasBitmapData.draw(multigraphCanvas, matrix); 
      var multigraphCanvasImage:Image = new Image(); 
      multigraphCanvasImage.load(new Bitmap(multigraphCanvasBitmapData)); 
      multigraphCanvasImage.content.width = multigraphCanvas.width; 
      multigraphCanvasImage.content.height = multigraphCanvas.height; 
      var multigraphCanvasImageBitmapData:BitmapData = new BitmapData(multigraphCanvas.width, multigraphCanvas.height, true, 0xffffffff); 
      multigraphCanvasImageBitmapData.draw(multigraphCanvasImage); 

      // DEBUGGING 
      PopUpManager.addPopUp(multigraphCanvas, this); 

      // DEBUGGING 
      var debugImage:Image = new Image(); 
      debugImage.source = multigraphCanvasImageBitmapData; 
      var debugTitleWindow:TitleWindow = new TitleWindow(); 
      debugTitleWindow.addElement(debugImage); 
      PopUpManager.addPopUp(debugTitleWindow, this); 

      // encode the canvas bitmap into a JPG byte array 
      var jpgEncoder:JPEGEncoder = new JPEGEncoder(85); 
      var jpgByteArray:ByteArray = jpgEncoder.encode(multigraphCanvasImageBitmapData); 

      // save the JPG byte array as a file 
      var fileReference:FileReference = new FileReference(); 
      fileReference.save(jpgByteArray, title + ".jpg"); 
     } 

我能想到的BitmapData.draw()方法來繪製它傳遞的顯示對象的每個部件,或者它只是使最頂層的元素,沒有一個孩子(這是什麼它看起來像我)?

回答

0

我相信組件需要在BitmapData.draw()的顯示樹中才能呈現它們。

+0

我如何讓它們進入顯示樹?將該組件添加爲顯示對象的組件的子組件或元素? – 2011-04-01 16:17:38

0

我已經過去了24小時,所以如果功能壞了不要責怪我:) 這是一個精簡版的函數我有一個容器(c1)的快照併發送它關閉到服務器。我是base64編碼,因爲這是Java人想要的後端。你將不得不按照你的需求設置。我剪了很多的東西,我在這個功能

private function getSnapShot(e:MouseEvent):String{ 
    var matrix:Matrix = new Matrix() 
    matrix.tx = 0; 
    matrix.ty = 0; 
    var finished1:BitmapData = new BitmapData(this.c1.width,this.c1.height,true,0xffffffff); 
    finished1.draw(this.c1, matrix ); 
    var myImage:Image = new Image(); 
    myImage.load(new Bitmap(finished1)); 
    myImage.content.width = this.c1.width; 
    myImage.content.height = this.c1.height; 
    var finished:BitmapData = new BitmapData(this.c1.width,this.c1.height,true,0xffffffff); 
    finished.draw(myImage); 
    myImage = null; 
    var encoder:JPEGEncoder = new JPEGEncoder(); 
    var data:ByteArray = encoder.encode(finished); 
    var b64:Base64Encoder = new Base64Encoder() 
    b64.encodeBytes(data) 
    return b64.toString(); 
} 

,你可能只需要返回「數據」,這是JPG

+0

基本上你需要創建一個你想要的大小的bitmapData對象。然後將容器放入其中。然後將bitMapData加載到圖像對象中。最後編碼它如何你喜歡 – 2011-04-01 16:24:18

+0

噢是的忘記了,你需要從你剛剛創建的Image對象創建第二個bitMapData這是你缺少的關鍵部分 – 2011-04-01 16:31:11

0

檢查源顯示對象容器的註冊點。

讓我們想象以下情形:

的顯示對象容器包含視覺像矩形,該DisplayObjectContainer具有登記在左下所以沒有內容可在X,Y = 1,1。

會的BitmapData.draw複製從0,0開始(如果你不通過矩陣轉換另行指定)的內容,這樣你會得到一個空白區域(或中BitmapData的默認填充顏色)