2011-06-01 68 views
1

我已經搜索了很多,但似乎沒有任何工作適合我。在這方面非常感謝有人的幫助。非常感謝。我是AS3的新手。我正在使用FlashDevelop。下面是我使用的代碼,如何將兩個位圖合併爲一個位圖並將其保存到本地驅動器

包 {

import flash.display.Loader; 
import flash.display.MovieClip; 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.geom.Matrix; 
import flash.geom.Point; 
import flash.display.Bitmap; 
import flash.display.BitmapData; 
import flash.display.BitmapDataChannel; 
import flash.net.URLRequest; 
import flash.events.MouseEvent; 
import flash.utils.ByteArray; 
import flash.net.FileReference; 
import com.adobe.images.JPGEncoder; 
import flash.geom.Rectangle; 

public class Main extends Sprite 
{ 
    private var modelBmp : BitmapData; 
    private var alphaBmp : BitmapData; 
    private var destPoint : Point = new Point(0, 0); 
    private var mask1:Loader = new Loader(); 
    private var mask2:Loader = new Loader(); 
    private var f:Bitmap; 
    private var fileReference:FileReference = new FileReference(); 
    private var movie:MovieClip = new MovieClip(); 
    private var loadedimage:Bitmap; 
    private var loadedimage1:Bitmap; 
    public function Main():void 
    { 
     if (stage) init(); 
     else addEventListener(Event.ADDED_TO_STAGE, init); 
    } 

    private function init(e:Event = null):void 
    { 

     if (loadAssets()) { 
      trace('merge loaded'); 
     modelBmp = new BitmapData(loadedimage.width, loadedimage.height); 
     modelBmp.draw(loadedimage); 
     alphaBmp = new BitmapData(loadedimage1.width, loadedimage1.height); 
     alphaBmp.draw(loadedimage1); 

     var rect:Rectangle = new Rectangle(0, 0, 200, 200); 
     var pt:Point = new Point(20, 20); 
     var mult:uint = 0x80; // 50% 
     modelBmp.merge(alphaBmp, rect, pt, mult, mult, mult, mult); 

     var bm1:Bitmap = new Bitmap(modelBmp); 
     addChild(bm1); 
     bm1.x = 400; 
     var bm2:Bitmap = new Bitmap(alphaBmp); 
     addChild(bm2); 
     bm2.x = 200;} 
       } 

     private function loadAssets():void 
     { 
     mask2.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete1); 
     mask1.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
     mask2.load(new URLRequest("Photo.png")); 
     mask1.load(new URLRequest("back.png")); 
     trace('asset loaded'); 
     } 

     private function loadComplete(event:Event):void 
     { 
     loadedimage = Bitmap(mask1.content) 
     var bitmap:BitmapData = new BitmapData(loadedimage.width, loadedimage.height, false, 0xffffffff); 
     bitmap.draw(loadedimage, new Matrix()) 
     var image:Bitmap = new Bitmap(bitmap); 
     //addChild(image); 
     trace('image1 loaded'); 
     } 

     private function loadComplete1(event:Event):void 
     { 
     loadedimage1 = Bitmap(mask2.content) 
     var bitmap:BitmapData = new BitmapData(loadedimage1.width, loadedimage1.height, false, 0xffffffff); 
     bitmap.draw(loadedimage1, new Matrix()) 
     var image:Bitmap = new Bitmap(bitmap); 
     //addChild(image); 
     trace('image2 loaded'); 
     } 

} 

}

+2

請詳細說明你的意思是合併!另外,你到目前爲止嘗試過哪些方法無效? – dain 2011-06-01 11:06:06

+0

是的,你的問題很模糊。 – midhunhk 2011-06-01 11:15:12

+0

除合併之外,如果您正在使用AIR,您可以將'Bitmap's flex保存爲用戶的硬盤上的JPEG或PNG文件,或者如果您正在開發一個swf,可以將'Bitmap'數據發送到服務器在網頁上運行。 – midhunhk 2011-06-01 11:39:54

回答

0

這似乎有點在鼻子上,但你可以使用BitmapData類的merge()方法來合併兩個位圖圖像合爲一體。在這些鏈接上有一個使用merge()方法的例子。

就保存到本地磁盤而言,Flash Player允許使用FileReference類訪問文件系統。 FileReference類具有save()方法,該方法提示用戶瀏覽文件系統上的位置。

對於Air應用程序,您可以使用flash.filesystem包中的類訪問文件系統。

+0

我已經編輯了以上使用的AS3代碼。你們可以請你告訴我這段代碼有什麼問題。我沒有得到任何輸出。非常感謝... – Emdad 2011-06-01 15:28:54

+0

看起來像Bosworth釘了它。希望對你有效。 – elekwent 2011-06-01 16:01:36

5

如何使用Bitmap.merge():

var bitMapData1:BitmapData = new BitmapData(100,100); //or embedded item 
var bitMapData2:BitmapData = new BitmapData(100,100); // " 

var bitmap:Bitmap = new Bitmap(bitMapData1); 
this.addChild(bitmap); 

bitmap.merge(bitMapData2, new Rectangle(0, 0, 100, 100), new Point(0, 0), 128, 128, 128, 128); 

正如其他人所指出的,閃光被創建,更改,修改,保存或以其他方式處理文件禁止。有幾種方法可以將這些數據從閃存中獲取並轉換爲具有這些功能的技術(如PHP),或者您可以使用Air中的flash.filesystem包(如前所述)。

希望幫助=

=更新=

你的代碼是有問題的,你寫你的URLRequest,然後在一個函數時加載的內容採取行動。 URL請求根本沒有時間觸發,並且其餘的函數失敗,因爲Mask2.content == undefined or null ...我很驚訝它不會拋出錯誤。

除此之外,它看起來應該工作。

試試這個:

private var _mask1:Loader; // _lowerCase naming convention 

//constructor... call init() 
//init.. call loadAssets() 

private function loadAssets():void 
{ 
_mask1 = new Loader(); //generally not a good idea to create objects when declaring variable 
    _mask1.addEventListener(Event.COMPLETE, onCompleteFunction); 
    _mask1.load(new URLRequest("Dress04.png")); 

    private function onCompleteFunction(e:Event):void 
    { ... 

注意,因爲你正在做多個負載,則需要檢查,如果兩者都作用在加載內容之前加載。你可以用一個簡單的布爾檢查或者...做到這一點。你也可以看看像LoaderMax這樣內置負載排隊的東西。

還要注意,良好的資產加載通常涉及try ... catch語句和幾個事件的處理 - 例如,IOErrorEvent.IO_ERROR

=更新2 =

好了 - 我們剛剛進入編程邏輯了。

這是一個問題:

private function init(e:Event = null):void 
     { 

      if (loadAssets()) { 
       trace('merge loaded'); 
//... 
//... 
private function loadAssets():void 
     {... 

你基本上要求loadAssets()的返回值,但它的返回類型是void,因此絕對會失敗。除此之外,loadAssets()只會激發裝載程序,而不會跟蹤負載是否成功。

讓我們將它分解成幾個步驟,併成立了一個非常簡單的裝載隊列:

import flash.display.Bitmap; 
import flash.display.BitmapData; 
import flash.display.Loader; 
import flash.display.MovieClip; 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.geom.Matrix; 
import flash.geom.Point; 
import flash.geom.Rectangle; 
import flash.net.URLRequest; 

    public class Main extends Sprite 
    { 
     private var modelBmp : BitmapData; 
     private var alphaBmp : BitmapData; 
     private var destPoint : Point; 
     private var mask  : Loader; 
     private var f   : Bitmap; 
     private var movie  : MovieClip; 
     private var loadedImages: Array; 
     private var imageQueue  : Array; 

     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     //initialize variables 
     private function init(e:Event = null):void 
     { 
      //just set up a simple queue of images to load 
      imageQueue  = ['Photo.png', 'back.png']; 
      loadedImages = []; 

      destPoint  = new Point(0, 0); 
      mask   = new Loader(); 
      movie   = new MovieClip(); 

      loadAsset(imageQueue[0]); 
     } 

     private function loadAsset(target:String):void 
     { 
      mask.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
      mask.load(new URLRequest(target)); 
     } 

     private function loadComplete(event:Event):void 
     { 
      loadedimage = Bitmap(mask.content); 

      var bitmap:BitmapData = new BitmapData(loadedimage.width, loadedimage.height, false, 0xffffffff); 
      bitmap.draw(loadedimage, new Matrix()) 
      var image:Bitmap = new Bitmap(bitmap); 
      loadedImages.push(image); 
      mask.unload(); 

      trace(imageQueue[0] + " loaded"); 
      imageQueue.splice(0, 1); //remove the first index 

      if (imageQueue.length > 0){ 
       loadAsset(imageQueue[0]); 
      }else{ 
       mergeImages(); //if the queue is empty, then merge 
      } 
     } 

     private function mergeImages():void 
     { 
      modelBmp = new BitmapData(Bitmap(loadedImages[0]).width, Bitmap(loadedImages[0]).height); 
      modelBmp.draw(loadedimage); 
      alphaBmp = new BitmapData(Bitmap(loadedImages[1]).width, Bitmap(loadedImages[1]).height); 
      alphaBmp.draw(loadedimage1); 

      var rect:Rectangle = new Rectangle(0, 0, 200, 200); 
      var pt:Point = new Point(20, 20); 
      var mult:uint = 0x80; // 50% 
      modelBmp.merge(alphaBmp, rect, pt, mult, mult, mult, mult); 

      var bm1:Bitmap = new Bitmap(load); 
      addChild(bm1); 
      bm1.x = 400; 
      var bm2:Bitmap = new Bitmap(alphaBmp); 
      addChild(bm2); 
      bm2.x = 200;} 

     } 

    } 

我沒有檢查,看看這個工作,所以它可能需要一點搞亂時,但基本的想法應該爲你工作。有很多方法來處理鏈式條件資產加載,這是一個簡單的例子。

希望有幫助 -

+0

我編輯了上面我使用的AS3代碼。你們可以請你告訴我這段代碼有什麼問題。我沒有得到任何輸出。非常感謝... – Emdad 2011-06-01 15:29:03

+0

@Emdad查看我的更新 - – Bosworth99 2011-06-01 15:48:11

+0

我按照你的建議,嘗試過但沒有得到任何輸出。上面顯示了更新的代碼。請幫我找出這個代碼現在有什麼問題?非常感謝您的時間。 – Emdad 2011-06-02 16:38:03

相關問題