【问题标题】:AS3 Bitmap Object Not Smoothing at Low Scale valuesAS3 位图对象在低比例值下不平滑
【发布时间】:2012-02-07 17:44:38
【问题描述】:

我需要帮助获取位图以在缩放非常小后正确​​应用平滑。

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

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

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

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

我还尝试了一些在搜索时发现的其他解决方法,例如:

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

下面是一些重现问题的示例代码。 (我在本地运行,所以我的 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 允许将位图添加到 Spark 元素中向上 mxml)。

<?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>

【问题讨论】:

  • 您始终可以通过BitmapData.draw() 创建BitmapData 的较小副本并缩放副本来解决此问题。这需要一些逻辑来创建副本和bitmap.bitmapData 切换。
  • 感谢您的提示。 :)我确实尝试过这个并且它有效,但它不能很好地适应我当前的渲染架构。如果情况变得更糟,我会想办法解决。

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


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

【讨论】:

  • 我不得不将项目的这一部分搁置几天。一旦我回到它,我会尝试 z 属性。感谢您的输入。 (此外,我无法将源图像更改为 2 的幂,但我可能能够使用之前使用 2 维的新幂的 BitmapData 绘制来制作图像的居中副本应用缩放。这与我在上述评论中描述的架构挑战相同)
  • 更改 Z 属性会从图像中移除所有平滑,使问题变得更糟。我正在使用(和定位)flash player 11。我发现原始帖子中的评论是唯一可行的解​​决方法,因为不能保证源图像是 2 的幂。我熟悉 mipmapping,iirc 它是在 id tech 1 中用于其专有的纹理格式。大概今天还在用。但是,这不是一个选项,因为我无法控制源图像。但渐进式缩放的使用确实看起来像是一种 mipmapping。
  • +1 不知道 z 属性强制“a”平滑,谢谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多