2012-02-07 10 views
0

非常に小さくスケーリングされた後にスムージングを適切に適用するには、ビットマップを取得する手助けが必要です。低スケール値でAS3ビットマップオブジェクトが平滑化されない

私が今やっていることは、.pngイメージをLoaderオブジェクトで読み込むことです。ファイルをロードした後、loaderInfoのコンテンツをビットマップにキャストし、スムージング値をtrueに設定しました。これは、ScaleXとScaleYの値が0.5未満になるまで問題なく動作します。

たとえば、1000x1000オブジェクトがある場合、200x200に縮小すると、ビットマップスムージングが機能しなくなります。

  • 変更ビットマップ上のscaleXプロパティとscaleYプロパティ:

    は、私は次のサイジング方法のすべてを使用して問題を再現することができます。

  • ビットマップの高さと幅のプロパティを直接変更します。
  • ビットマップを別のスプライトの子として追加し、スプライトのscaleXおよびscaleYプロパティを変更します。
  • ビットマップを別のスプライトの子として追加し、スプライトの高さと幅のプロパティを変更します。
  • 行列スケールで新しいBitmapDataオブジェクトを作成し、元のBitmapDataを描画します。

    • ビットマップの高さと幅を強制的に1.001又は0.999
    • に画像のscaleXプロパティを設定:

    Iはまたなど、検索時に私が見つけた他のいくつかの回避策を試してみました偶数のオブジェクトになります。

以下は、問題を再現するためのサンプルコードです。

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ファイルを持っている(私はビン-debugフォルダーにtestimage.pngのコピーを持っているので、私はローカルでこれを実行しています)アプリケーションmxmlコードに追加されたUIComponantインスタンス(UIComponentは、mxmlを構成するSpark要素にビットマップを追加できるようにするものです)。元のサイズも2

  • ミップマッピングの力であると2の累乗であるサイズに

    <?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()を使用してより小さなコピーを作成し、コピーをスケーリングします。これは、コピー作成と 'bitmap.bitmapData'スイッチングのためのいくつかのロジックを必要とします。 –

    +0

    チップをありがとう。:)私はこれを試して、それは動作しますが、私の現在のレンダリングアーキテクチャにうまく収まらないでしょう。悪化すると悪化するでしょう。私はそれを働かせる方法を見つけるでしょう。 –

    答えて

    2
    • スケールために、画像の複数のズームバージョンを作成するためのゲーム業界で人気のある用語でありますスケーリングのエイリアシングを低減します。
    • Flash Player 10のハックとして、 'z'プロパティを1に設定します。これにより、より多くのメモリとパフォーマンスが必要になりますが、ビットマップのハードウェアスムージングが有効になります。
    +0

    私はこのプロジェクトのこの部分を数日間保留しなければなりませんでした。私がそれに戻ると、私はzプロパティに試してみます。入力いただきありがとうございます。 (ソース画像を2の累乗に変更することはできませんが、スケーリングを適用する前に2次元の新しい累乗でBitmapData描画を使用してイメージの中央にコピーを作成する可能性がありますこれは私が上記のコメントで説明したのと同じ構造的課題を持っています) –

    +0

    Zプロパティを変更すると、すべてのスムージングがイメージから削除され、問題が悪化しました。私はフラッシュプレーヤー11を使用しています。 ソース画像が2の累乗であることは保証されていないため、元の投稿からのコメントが唯一可能な回避策であることがわかりました。 ミップマッピングに精通しています、iircは独自のテクスチャ形式のためにid tech 1で使用されていました。おそらく今日も使われているでしょう。しかし、私はソース画像を制御することができないので、オプションではありません。 しかし、プログレッシブスケーリングの使用は、ミップマッピングの一種のように見えます。 –

    +0

    +1「a」スムージングを強制するzプロパティについては知りませんでした。ありがとうございます。 – kontur

    0

    私はStageQuality.BESTstage.qualityプロパティを設定すると、スケーリングされたビットマップ上の平滑化を促進することを発見しました。

    関連する問題