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

Actionscript 3 AS3位图对象在低比例值下不平滑,actionscript-3,flash,apache-flex,bitmap,flex-spark,Actionscript 3,Flash,Apache Flex,Bitmap,Flex Spark,我需要帮助得到一个位图应用平滑后,被缩放非常小 我现在正在做的是加载一个带有加载器对象的.png图像。加载文件后,我将loaderInfo的内容转换为位图,并将平滑值设置为true。在ScaleX和ScaleY值小于0.5之前,这不会有任何问题 例如,如果我有一个1000x1000对象,将其缩小到200x200会导致位图平滑不再工作 我可以使用以下所有大小调整方法重现问题: 更改位图上的scaleX和scaleY属性 直接更改位图的高度和宽度属性 将位图作为另一个精灵的子对象添加,并更改精灵的

我需要帮助得到一个位图应用平滑后,被缩放非常小

我现在正在做的是加载一个带有加载器对象的.png图像。加载文件后,我将loaderInfo的内容转换为位图,并将平滑值设置为true。在ScaleX和ScaleY值小于0.5之前,这不会有任何问题

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

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

  • 更改位图上的scaleX和scaleY属性
  • 直接更改位图的高度和宽度属性
  • 将位图作为另一个精灵的子对象添加,并更改精灵的scaleX和scaleY属性
  • 将位图作为另一个精灵的子对象添加,并更改精灵的高度和宽度属性
  • 创建具有矩阵比例的新BitmapData对象,然后在其上绘制原始BitmapData
我还尝试了搜索时发现的一些其他解决方法,例如:

  • 将图像的scaleX设置为1.001或0.999
  • 强制位图对象的高度和宽度为偶数
下面是一些重现问题的示例代码。(我在本地运行此程序,因此我的bin debug文件夹中有testimage.png的副本)

我还有一个mxml文件,它创建MainObj类的实例,并将comp属性设置为已添加到应用程序mxml代码中的UIComponent实例(UIComponent允许将位图添加到构成mxml的Spark元素中)


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

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

通过
BitmapData.draw()
创建
BitmapData
的较小副本并缩放副本,始终可以解决此问题。这需要一些逻辑来创建拷贝和切换位图。位图数据。谢谢提示。)我确实尝试过这个方法,但它不能很好地适应我当前的渲染架构。如果情况变得更糟,我会想办法解决的。我不得不把项目的这一部分搁置几天。一旦我回到它,我会给z属性一个尝试。谢谢你的意见。(此外,我无法将源图像更改为2的幂次,但我可能能够在应用缩放之前使用新的2维幂次位图数据绘制图像的居中副本。这与我在上述注释中描述的架构挑战相同)更改Z属性会删除图像中的所有平滑,使问题变得更糟。我正在使用(并瞄准)flash player 11。我发现原始帖子中的评论是唯一可行的解决方法,因为源图像不能保证为2的幂。我熟悉mipmapping,iirc它在id tech 1中用于他们专有的纹理格式。可能今天还在用。但是,这不是一个选项,因为我无法控制源图像。但是渐进缩放的使用看起来确实像是mipmapping的一种形式。+1不知道z属性强制“a”平滑,谢谢。
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);
    }
}
<?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>