如何在Flash中反动态加载动态加载的PNG

问题描述:

我有一个Flash文件,用于加载透明PNG(线条图),并使用Flash来允许用户选择绘图的颜色,并立即更改颜色。如何在Flash中反动态加载动态加载的PNG

这是所有的工作,它应该是。我使用UILoader组件来加载通过flashvars接收的图像,然后根据需要更改颜色。

唯一的事情是,图像有时看起来不是很平滑。我看过各种文章,人们谈论在位图上使用smoothing = true。但我不确定在哪里设置它,或者它如何工作。

我是Flash和ActionScript的新手,任何人都可以帮助我吗?以下是我的代码(main.as)。我遗漏了changeColor()和getFlashvars()函数以及导入行。因为我认为这并不重要,并且尽可能保持简单和简短。

非常感谢任何帮助和或指针,你可以给我!

package { 
public class Main extends MovieClip { 
    public function Main() { 
     init(); 

     if(getFlashvars().img != undefined) { 
      if(getFlashvars().clr != undefined) { 
       loadImage(getFlashvars().img, getFlashvars().clr); 
      } else { 
       loadImage(getFlashvars().img); 
      } 
     } else { 
      loadImage('example.png', 'FFFFFF'); 
     } 
    } 

    private function init() { 
     ExternalInterface.addCallback('changeColor', this.changeColor); 

     progressBar.visible = false; 
     progressBar.mode = 'manual'; 
     progressBar.source = uiLoader; 

     uiLoader.scaleContent = true; 
     uiLoader.addEventListener(ProgressEvent.PROGRESS, eventImageProgress); 
     uiLoader.addEventListener(Event.COMPLETE, eventImageLoaded); 
    } 

    /** 
    * Load a new image from the given url. Replace the color in it with newColor 
    */ 
    public function loadImage(url:String, newColor:String='') { 
     //progressBar.visible = true; 
     uiLoader.load(new URLRequest(url)); 

     if(newColor.length > 0) { 
      changeColor(newColor); 
     } 
    } 
} 

as stated clearly in the documentation,平滑是一个位图的公共属性。

myBitmap.smoothing = true; 

调用一个新的位图的构造

var myBitmap:Bitmap = new Bitmap(myBitmapData, PixelSnapping.AUTO, true); 
         //where the last boolean represents the smoothing property 

,你也可以尝试你的显示对象上设置一个光模糊滤镜,如果你觉得平滑不够时,也可以设置。

我在Flex中做的是创建一个新组件,如果可能的话,它会在其内部位图上设置平滑属性。类似的东西可能在Flash中可行。

public class SmoothImage extends Image 
{ 

    override protected function updateDisplayList(w:Number, h:Number):void 
    { 
     super.updateDisplayList(w, h); 
     if (content is Bitmap) 
     { 
     var bitmap : Bitmap = content as Bitmap; 

     if (bitmap != null && 
      bitmap.smoothing == false) 
     { 
      bitmap.smoothing = true; 
     } 
     } 
    } 
} 

然后你可以使用它像:

image = new SmoothImage(); 
image.source = url; 

可能有助于!主要想法是访问位图组件本身来设置平滑属性,无论是在您的文件还是单独的组件中发生,这就是您需要执行的操作。

如果您在使用此平滑代码时遇到问题,则仅适用于从相同域或已将您添加到其crossdomain.xml文件的域中获取图像的情况。

在你完成处理程序中,你可以做这样的事情

// First, you need to copy the loaded image. 
var displayObject :DisplayObject = uiLoader.content; 
var bitmapData :BitmapData = new BitmapData(displayObject.width, displayObject.height); 
bitmapData.draw(displayObject); 

// Then create a new image from the loaded image. 
var bitmap :Bitmap = new Bitmap(bitmapData); 
bitmap.smoothing = true; // This is what actually does the anti-aliasing. 

addChild(bitmap); 

但我安静不知道在哪里设置 这个

我要说的是,在最简单的形式,你可以在Event.COMPLETE的处理程序的加载图像(位图)上将平滑设置为true,因此eventImageLoaded就是您的情况。

事情是这样的例子:

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded); 
loader.load(new URLRequest("http://www.google.com/images/logos/ps_logo.png")); 

function imageLoaded(e:Event):void { 
    e.target.content.smoothing = true; 
    // Or Bitmap(e.target.content).smoothing = true; if you prefer. 
} 
+0

谢谢,这样的事情是什么,我期待的!我试过了,只设置了imageLoaded()中的任一行。因为我已经通过UILoader加载了图像。但这似乎不起作用,但也不会给出任何错误。有没有可能在UILoader组件上设置它?或者我必须使用不同的组件来加载图像? - 如果可能,我想继续使用UILoader,因为它也会自动为我调整图像大小。 – 2010-10-24 07:25:57

几乎没有拉斯,解决的办法是

Bitmap(UILoaderTarget.content).smoothing = true;