1

2 次元配列を DDS に変換してファイルに保存しようとしています。Array は Color 構造体でいっぱいです (それぞれが赤、緑、青、およびアルファ コンポーネントを持ちます)。配列を正しい形式にしたら、それをファイル部分に保存しても問題はないと確信しています。

これには lib を使用するか (そのライセンスでクローズド ソース プロジェクトで使用でき、Linux と Windows の両方で動作する限り)、手動で行うことも問題ありません。やれ。

誰かが私を正しい方向に向けることができれば、本当に感謝しています。

4

1 に答える 1

2

DirectDraw では、構造体に特定のフィールドを設定し、それをインターフェイスのメソッドにDDSURFACEDESC渡すことによって、メモリ内のデータからサーフェスを作成できます。CreateSurfaceIDirectDraw

DDSURFACEDESC最初に、構造体のどのフィールドに正しい情報が含まれているかを DirectDraw に伝える必要があります。これには、dwFlagsフィールドを次の一連のフラグに設定しますDDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_LPSURFACE | DDSD_PITCH

ああ、これはシステム メモリ サーフェスに対してのみ機能するため、おそらくフィールドにDDSCAPS_SYSTEMMEMORYフラグを追加する必要がありddsCaps.dwCapsます (DirectDraw がデフォルトで追加しない場合)。

次に、フィールドでピクセル データ配列の先頭のアドレスを指定しますlpSurface。バッファが連続している場合は、lPitchを 0 に設定するだけです。それ以外の場合は、そこに正しいピッチを設定します (2 つの後続のスキャンラインの始まりの間のバイト単位の距離)。

フィールドで正しいピクセル形式を設定し、ddpfPixelFormat正しいビット深度を でdwRGBBitCount、RGB マスクを でdwRBitMaskdwGBitMaskおよび で設定しdwBBitMaskます。

次に、lXPitchをピクセルのバイト数 (RGB の場合は 3) に設定します。使用するピクセル形式によって異なります。

次に、塗りつぶされた構造を渡して、それがCreateSurface機能するかどうかを確認します。

この方法でサーフェスを作成する場合、DirectDraw は自身のデータ バッファを管理せず、一度Releaseサーフェスを呼び出すとこのメモリを解放しないことに注意してください。このメモリがサーフェスで使用されなくなったら、自分で解放する必要があります。

一方、このピクセル データをビデオ メモリに配置する場合は、通常の方法でオフスクリーン サーフェスを作成してからロックし、ビデオ メモリ内の独自のバッファにピクセルをコピーする必要があります (lpSurfaceフィールドにアドレスを入力しlPitch、カウントを忘れずに取得してください!)、ロックを解除します。

于 2014-03-28T13:44:46.417 に答える