WisdomSoft - for your serial experiences.

テクスチャの保存

Texture2D オブジェクトは JPEG または PNG フォーマットで任意のストリームに出力できます。これを応用することで、プログラムで処理したテクスチャ画像やゲームのスクリーンショットなどを画像ファイルとしてディスクに保存できます。

テクスチャを画像ファイルに保存する

Texture2D オブジェクトは画像ファイルとして任意のストリームに保存できます。ゲーム内で生成したテクスチャをストレージに保存するといった応用が可能です。

対応フォーマットは JPEG と PNG の 2 種類のみです。JPEG フォーマットで保存する場合は SaveAsJpeg() メソッドを、PNG フォーマットで保存する場合は SaveAsPng() メソッドを呼び出します。

Texture2D クラス SaveAsJpeg() メソッド
public void SaveAsJpeg (
         Stream stream,
         int width,
         int height
)
Texture2D クラス SaveAsPng() メソッド
public void SaveAsPng (
         Stream stream,
         int width,
         int height
)

どちらのメソッドもパラメータは同じです。stream パラメータに出力先となるストリームを、width パラメータに幅、height パラメータに高さを指定します。

古い XNA Framework 3.1 以下のバージョンでは、これよりも多くのファイルフォーマットに対応した Save() メソッドがありましたが XNA Framework 4.0 で廃止されました。ストリームではなくファイル名で書き込んでいたため柔軟性に乏しく、ディスクへのアクセスが必要なので Windows PC にのみ対応したメソッドでした。

これに対して XNA Framework 4.0 で置き換えられた上記のメソッドは、ストリームに書き込むため特定のストレージには依存せず、任意のバッファやネットワークに対しても保存できます。また、対応フォーマットも JPEG 及び PNG だけになりましたが、これは Web やスマートフォンなど任意のデバイスで実装しやすいという理由でしょう。

コード1
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System.IO;

public class TestGame : Game
{
    public static void Main(string[] args)
    {
        using (Game game = new TestGame()) game.Run();
    }

    private GraphicsDeviceManager graphicsDeviceManager;
    private SpriteBatch sprite;
    private Texture2D texture;

    public TestGame()
    {
        graphicsDeviceManager = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    }

    protected override void LoadContent()
    {
        sprite = new SpriteBatch(GraphicsDevice);
        texture = Content.Load<Texture2D>("TestImage");
        Color[] data = new Color[texture.Width * texture.Height];

        texture.GetData(data);
        for (int i = 0; i < data.Length; i++)
        {
            byte gray = (byte)(0.29 * data[i].R + 0.58 * data[i].G + 0.11 * data[i].B);
            data[i] = new Color(gray, gray, gray, data[i].A);
        }
        texture.SetData(data);

        using(Stream stream = File.Open("output.png", FileMode.OpenOrCreate, FileAccess.Write))
        {
            texture.SaveAsPng(stream, texture.Width, texture.Height);
        }

        base.LoadContent();
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.White);

        sprite.Begin();
        sprite.Draw(texture, Vector2.Zero, Color.White);
        sprite.End();

        base.Draw(gameTime);
    }
}
実行結果
コード1 実行結果

コード1は「テクスチャ生成 コード3」を改良し、プログラムでグレースケールに変換したテクスチャをディスクに保存しています。コードを実行すると、実行ファイルのディレクトリに output.png というファイルが出力され、正しく画像が保存されていることを確認できます。