可以在加载的SWF中平滑图像吗?

时间:2013-03-28 12:36:00

标签: image actionscript-3 flash smoothing

我正在尝试在AS3 / Haxe中将SWF加载到另一个SWF中。加载的SWF包含一些图像 - 但仅限于某些Shape.graphics元素。 (如graphics.beginBitmapFill(); ...) 这些图像没有平滑和锯齿。 在运行时,无论如何都可以平滑这些图像吗? 任何黑客都感兴趣! :)

提前致谢! 汤姆

更新抱歉,我忘了提及,我正在使用AVM2Loader将更多AS2-SWF(AVM1)加载到一个AS3-SWF(AVM2)中加载字节,并将AVM1 SWF转换为AVM2 - 它工作得很好。 :)

因此,在这些SWF中,我需要找到图像/位图,但只找到Shapes,其中graphics元素具有'图像'。如果我清除了这个graphics,那么所有图像都消失了,所以我认为,图像在某些graphics.beginBitmapFill(...);中,没有平滑。我希望触及它们,并在运行时切换平滑,如果可能的话。 (对不起,如果我第一次不够清楚。)

编辑(2014年1月23日):我找到了解决方案。它并不快,并且需要Flash Player 11.6。每个MovieClip图形属性都有一个新的readGraphicsData函数,它提供绘制整个MC的所有图形命令(Vector IGraphicsData)。并迭代这些命令,如果我将每个bitmapFill命令smooth参数更改为true,并重绘MC,它将被平滑,并且很好。 而已。不快,但工作。

3 个答案:

答案 0 :(得分:1)

我找到了它的解决方案。它并不快,并且需要Flash Player 11.6。每个MovieClip图形属性都有一个新的readGraphicsData函数,它提供绘制整个MC的所有图形命令(Vector IGraphicsData)。并迭代这些命令,如果我将每个bitmapFill命令smooth参数更改为true,并重绘MC,它将被平滑,并且很好。 而已。不快,但工作。

答案 1 :(得分:0)

function onLoad(event):Void
{
   pic.forceSmoothing  = true;
}

答案 2 :(得分:0)

Smoothing is a property of bitmaps默认情况下已关闭。

var image = new Bitmap(bitmapData);
image.smoothing = true;

通常情况下,在外部加载时,你的bitmapData将在loader.content.bitmapData中,但是你已经存储它了。


<强>更新

如果你想在不知道SWF结构的情况下平滑加载的SWF中的所有图像,那么你将不得不递归地挖掘该SWF的差异,并取决于该对象是否是一个Bitmap ,打开平滑。

function recursivelySmooth(obj):void {
    for (var i:int = 0; obj.getChildAt(i); i++) {
        var item:* = obj.getChildAt(i);
        if (item is Bitmap) {
            item.smoothing = true;
        } else if (item.hasOwnProperty("numChildren") == true) {
            recursivelySmooth(item);
        }
    }
}

这是徒手写的,所以你可能需要双重检查一切都是正确的,但这是基本的想法。只需在你的swf上调用recursivelySmooth(),它就会挖掘所有可以拥有子元素并平滑它们的对象。