如何在Flash中对动态加载的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);
        }
    }
}
    
已邀请:
正如文档中明确指出的那样,平滑是位图的公共属性。
myBitmap.smoothing = true;
它也可以在调用新的位图构造函数时设置
var myBitmap:Bitmap = new Bitmap(myBitmapData, PixelSnapping.AUTO, true);
                      //where the last boolean represents the smoothing property
如果您觉得平滑不够,也可以尝试在显示对象上设置光线模糊滤镜。     
几乎有Lars,解决方案是
Bitmap(UILoaderTarget.content).smoothing = true;
    
我在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.
}
    

要回复问题请先登录注册