2012-02-07 41 views
0

我需要帮助让位图在缩放非常小之后正确应用平滑。AS3位图对象在低标度值时不平滑

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

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

我可以重现使用以下所有上浆方法的问题:

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

我也试过,我发现搜索时,如一些其他方法:

  • 图像的scaleX设置为1.001或0.999
  • 迫使位图的高度和宽度对象是偶数。

下面是一些重现问题的示例代码。 (我在本地运行这让我有testimage.png的副本,我斌-debug文件夹)

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); 
    } 
} 

我也有创建MainObj类的一个实例,并设置补偿性质的MXML文件在应用程序mxml代码中添加的UIComponant实例(UIComponent允许将位图添加到组成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> 
+3

您可以随时通过BitmapData.draw()创建一个较小的“BitmapData”副本并缩放副本来解决此问题。这需要一些逻辑来创建副本和“bitmap.bitmapData”切换。 – 2012-02-07 18:53:59

+0

感谢您的提示。:)我确实尝试了这一点,它的工作原理,但它不适合我当前的渲染体系结构。如果情况变得更糟,我会找到一种方法来处理它。 – 2012-02-16 14:08:21

回答

2
  • 规模到是2与原来的尺寸也为2
  • 纹理映射的电源的功率大小是在游戏行业的一个术语流行,为了使图像的多个缩放版本以减少缩放混叠。 (尤其是对于根本性的大小更改)
  • 作为Flash Player 10的黑客,将'z'属性设置为1.这将启用位图的硬件平滑,尽管它会占用更多的内存和性能。
+0

我不得不将这部分项目搁置几天。只要我回到它,我会尝试z属性。感谢您的意见。 (另外,我无法将源图像更改为2的幂次,但是我可能*能够在应用缩放之前使用具有2维新幂的BitmapData绘制来创建图像的居中副本。这与我在上面的评论中描述的相同的体系结构挑战) – 2012-02-16 14:11:56

+0

更改Z属性会将图像中的所有平滑移除,从而使问题变得更糟。我使用(和定位)的Flash Player 11 我发现从原岗位的评论是唯一可行的解​​决方法,因为源图像不能得到保证的2 我熟悉的纹理映射为动力,iirc将它用于id tech 1专有纹理格式。可能今天仍然使用。然而这不是一个选项,因为我无法控制源图像。 但渐进缩放的使用看起来像是一种mipmapping形式。 – 2012-02-21 17:55:14

+0

+1不知道z属性迫使“平滑”,谢谢。 – kontur 2012-11-21 12:22:45

0

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