XNAのTexture2Dが保持できるのはそれほど多くありません。使用するプロファイルに応じて、その制限は2048または4096ピクセル幅です。私の調査からわかる限り(私が間違っていれば誰かが訂正してくれます)GDI画像には、ユーザーのメモリを超えないこと以外に制限はありません。
(XNAのサイズ制限内で)GDI画像とソースの四角形を取得し、実行時にそのデータから新しいTexture2Dを作成する最も効率的な方法を探しています。このプロセスでは、XNA 4.0の乗算済みアルファも考慮に入れる必要があります。
または...
Texture2D.FromStreamを取得し、ソースレクタングルも取得できるようにそれを適応させる方法。
要件は次のとおりです。
- コンテンツパイプラインはありません。実行時にそれらをロードできる必要があります。
- 可能であれば、リーチプロファイルのみを使用してください。
- Windowsのみに注意してください。移植性について心配する必要はありません。
TL; DR:
私は次のような方法が必要です:
Texture2D Texture2DHelper.FromStream(GraphicsDevice, Stream, SourceRectangle);
または
Texture2D Texture2DHelper.FromImage(Image, SourceRectangle)
できれば最初。
大局:
少しの間、ソースの四角形を無視して(物事を視覚化しやすくするために)、テクスチャ全体をGDIにロードし、完全にブルートフォースアプローチを使用してデータをTexture2Dに渡してみました。
using (System.Drawing.Image image = System.Drawing.Image.FromFile(path))
{
int w = image.Width;
int h = image.Height;
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(image);
uint[] data = new uint[w * h];
for (int i=0; i!=bitmap.Width; ++i)
{
for (int j=0; j!=bitmap.Height; ++j)
{
System.Drawing.Color pixel = bitmap.GetPixel(i, j);
Microsoft.Xna.Framework.Color color = Color.FromNonPremultiplied(pixel.R, pixel.G, pixel.B, pixel.A);
data[i + j * w] = color.PackedValue;
}
}
_texture = new Texture2D(device, w, h);
_texture.SetData(data);
}
そして結果は本当に遅かった。単純に行うよりも何倍も時間がかかりました:
Texture2D.FromStream(GraphicsDevice, new FileStream(path, FileMode.Open));
Bitmap.LockBitsとBlock Copyの使用についても考えましたが、そうすると、乗算前のアルファ補正が省かれ、コピー後にそれを適用する方法がわかりません。
私は、Texture2D.FromStreamを直接回避する方が良い解決策になると考えたくなります。Streamのしくみにはあまり詳しくありませんが、.NETでStreamとRectangleを取得するメソッドをいくつか見ました。どうすればそのようなことを達成できますか?まったく新しいFromStreamメソッド、または「Rectangle」機能を提供するStreamのラッパー。