AS3位图对象在低比例值下不平滑

时间:2012-02-07 17:44:38

标签: actionscript-3 flash flex bitmap flex-spark

我需要帮助获取位图,以便在缩放后非常小的情况下正确应用平滑。

我现在正在做的是使用Loader对象加载.png图像。加载文件后,我将loaderInfo的内容转换为位图,并将平滑值设置为true。在我达到小于0.5的ScaleX和ScaleY值之前,这没有问题。

例如,如果我有一个1000x1000对象,将其缩小到200x200会导致位图平滑不再有效。

我可以使用以下所有大小调整方法重现问题:

  • 更改位图上的scaleX和scaleY属性。
  • 直接更改位图的高度和宽度属性。
  • 将位图添加为另一个精灵的子节点,并更改精灵的scaleX和scaleY属性。
  • 将位图添加为另一个精灵的子节点,并更改精灵的高度和宽度属性。
  • 使用矩阵比例创建一个新的BitmapData对象,然后将原始的BitmapData绘制到其上。

我还尝试了一些我在搜索时找到的解决方法,例如:

  • 将图像的scaleX设置为1.001或0.999
  • 强制将Bitmap对象的高度和宽度设为偶数。

下面是一些用于重现问题的示例代码。 (我在本地运行这个,所以我在bin-debug文件夹中有一个testimage.png的副本)

public class MainObj
{
    public var comp:UIComponent;

    public function MainObj()
    {
    }

    public function LoadContent():void
    {
        var str:String = "testimage.png";
        var l:Loader = new Loader();
        l.contentLoaderInfo.addEventListener(Event.COMPLETE, LoadContentComplete);
        l.load(new URLRequest(str));
    }

    public function LoadContentComplete(e:Event):void
    {
        var li:LoaderInfo = e.target as LoaderInfo;
        var bmp:Bitmap = li.content as Bitmap;

        bmp.smoothing = true;
        bmp.scaleX = 0.2;
        bmp.scaleY = 0.2;
        comp.addChild(bmp);
    }
}

我还有一个mxml文件,用于创建MainObj类的实例,并将comp属性设置为已在Application mxml代码中添加的UIComponant实例(UIComponent允许将Bitmap添加到构成mxml的Spark元素。)

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" 
               minWidth="955" minHeight="600"
               width="800" height="600">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            private var mainObj:MainObj;
            override protected function initializationComplete():void
            {
                mainObj = new MainObj();
                mainObj.comp = comp;
                mainObj.LoadContent();

                super.initializationComplete();
            }
        ]]>
    </fx:Script>
    <s:VGroup width="100%" height="100%">
        <mx:UIComponent id="comp" width="100%" height="100%"/>
    </s:VGroup>
</s:Application>

2 个答案:

答案 0 :(得分:2)

  • 缩放到2的幂的大小,原始大小也是2
  • 的幂
  • Mipmapping是游戏行业中流行的术语,用于制作图像的多个缩放版本以减少缩放混叠。 (特别是对于激进的尺寸变化)
  • 作为Flash Player 10的黑客,将“z”属性设置为1.这将启用位图的硬件平滑,但会占用更多内存和性能。

答案 1 :(得分:0)

我发现将stage.quality属性设置为StageQuality.BEST可以增强缩放位图的平滑效果。