5

XNA ゲーム用に作成したレベル エディター (エディターも XNA にあります) で、Texture2Dオブジェクトをスケーリングできるようにしています。

ユーザーがレベルを保存しようとすると、実際にディスク上の画像ファイルのサイズを変更して、ゲームでスケーリングする必要がないようにしたいと考えています。

スケーリングされた Texture2D オブジェクトから画像ファイル (PNG を推奨) を作成する簡単な方法はありますか?

4

4 に答える 4

11

必要なサイズでレンダーターゲットにレンダリングし、レンダーターゲットテクスチャを保存することで、テクスチャをスケーリングできます。

この簡単な例は、それを行う方法を示しています。GraphicsDeviceのセットアップは無視してください。これは、小さな自己完結型の例を作成するためだけのものです。興味深いのは、レンダリングターゲットを作成し、スケーリングされたテクスチャを描画することです。可能な場合はレンダーターゲットを再利用する必要があります(同じサイズのすべてのイメージはレンダーターゲットを再利用できます)。

using System;
using System.Runtime.InteropServices;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

class Program
{
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr GetConsoleWindow();

    static void Main(string[] args)
    {
        string sourceImagePath = args[0];
        string destinationImagePath = args[1];
        int desiredWidth = int.Parse(args[2]);
        int desiredHeight = int.Parse(args[3]);

        GraphicsDevice graphicsDevice = new GraphicsDevice(
            GraphicsAdapter.DefaultAdapter,
            DeviceType.Hardware,
            GetConsoleWindow(),
            new PresentationParameters());
        SpriteBatch batch = new SpriteBatch(graphicsDevice);

        Texture2D sourceImage = Texture2D.FromFile(
            graphicsDevice, sourceImagePath);

        RenderTarget2D renderTarget = new RenderTarget2D(
            graphicsDevice, 
            desiredWidth, desiredHeight, 1, 
            SurfaceFormat.Color);

        Rectangle destinationRectangle = new Rectangle(
            0, 0, desiredWidth, desiredHeight);

        graphicsDevice.SetRenderTarget(0, renderTarget);

        batch.Begin();
        batch.Draw(sourceImage, destinationRectangle, Color.White);
        batch.End();

        graphicsDevice.SetRenderTarget(0, null);

        Texture2D scaledImage = renderTarget.GetTexture();
        scaledImage.Save(destinationImagePath, ImageFileFormat.Png);
    }
}
于 2009-04-01T13:24:32.413 に答える
0

テクスチャの大きい/小さいコピーを作成するこのようなコードがありますが、しばらくするとエラーが発生します。30回のサイズ変更の後、初めてではなく、例外が発生します。

レンダーターゲットの問題のようですが、よくわかりません。このコードを何度も実行すると、これらの例外も発生するのでしょうか?

于 2009-09-27T20:09:47.913 に答える
0

Texture2D.Save()を試しましたか?

于 2009-03-19T22:27:03.040 に答える
0

画像のスケーリングは、通常、それほど多くのオーバーヘッドを発生させません。さらに、同じテクスチャの異なるサイズをメモリにロードするのは無駄になるため、望ましくありません。

もちろん、Zune ゲームを作成している可能性もあります。つまり、スケーリングについてはおそらく私は理解していませんが、とにかく.

スケーリングされた画像を XNA から直接保存することはできないと思いますが、WinForms Image クラスを使用して画像をロードし、レベル エディターでサイズに合わせてスケーリングし、ディスクに保存し直すことができます。

ただし、テクスチャが BMP または PNG でない場合は、Texture2D.Save() コマンドを使用して、Image クラスで使用できる形式に変換する必要があります。

このスレッドは、Image クラスの使用に役立つ場合があります。 http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/6fe3d353-0b09-440b-95c9-701efdc9e20a/

于 2009-03-19T22:31:55.277 に答える