如何在Flash中对动态加载的PNG进行消除锯齿

时间:2010-10-22 12:17:04

标签: flash actionscript-3 png

我有一个Flash文件,用于加载透明PNG(线条图),并使用Flash允许用户选择绘图颜色,并立即更改颜色。

这一切都像它应该的那样工作。我正在使用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);
        }
    }
}

5 个答案:

答案 0 :(得分:3)

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

如果感觉平滑不够,也可以尝试在显示对象上设置光线模糊滤镜。

答案 1 :(得分:2)

几乎有Lars,解决方案是

Bitmap(UILoaderTarget.content).smoothing = true;

答案 2 :(得分:0)

我在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;

可能会有帮助!主要思想是访问位图组件本身以设置平滑属性,无论是在您的文件中还是在单独的组件中发生,这就是您需要做的事情。

答案 3 :(得分:0)

如果您在使用此平滑代码时遇到问题,则仅当您从同一域或将您添加到其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);

答案 4 :(得分:0)

  

但我不确定在哪里设置   此

我想说,在最简单的形式中,您可以在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.
}