XNA ゲーム用に作成したレベル エディター (エディターも XNA にあります) で、Texture2Dオブジェクトをスケーリングできるようにしています。
ユーザーがレベルを保存しようとすると、実際にディスク上の画像ファイルのサイズを変更して、ゲームでスケーリングする必要がないようにしたいと考えています。
スケーリングされた Texture2D オブジェクトから画像ファイル (PNG を推奨) を作成する簡単な方法はありますか?
XNA ゲーム用に作成したレベル エディター (エディターも XNA にあります) で、Texture2Dオブジェクトをスケーリングできるようにしています。
ユーザーがレベルを保存しようとすると、実際にディスク上の画像ファイルのサイズを変更して、ゲームでスケーリングする必要がないようにしたいと考えています。
スケーリングされた Texture2D オブジェクトから画像ファイル (PNG を推奨) を作成する簡単な方法はありますか?
必要なサイズでレンダーターゲットにレンダリングし、レンダーターゲットテクスチャを保存することで、テクスチャをスケーリングできます。
この簡単な例は、それを行う方法を示しています。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);
}
}
テクスチャの大きい/小さいコピーを作成するこのようなコードがありますが、しばらくするとエラーが発生します。30回のサイズ変更の後、初めてではなく、例外が発生します。
レンダーターゲットの問題のようですが、よくわかりません。このコードを何度も実行すると、これらの例外も発生するのでしょうか?
Texture2D.Save()を試しましたか?
画像のスケーリングは、通常、それほど多くのオーバーヘッドを発生させません。さらに、同じテクスチャの異なるサイズをメモリにロードするのは無駄になるため、望ましくありません。
もちろん、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/