2011-06-01 82 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

相关问题