2

主題がすべてを物語っていると思います。しかし、詳細には、ビットマップを読み込んで操作し、表示しており、GDIでそれを行っていました。繰り返し発生するため、スピードを追加したいと思います。

何年も前に、私は DirectX を他の目的で使用していましたが、私が見たものはすべて、DirectX をやめて Direct2D に移行するように言っています。そのため、その知識をすべて捨てて、最初からやり直す時が来ました。本当にMSのやり方です;-)

ビットマップを操作するために、レンダリングに入る前に、'Lock()' で取得できることがわかりました。また、インターフェイスの関数もサイズを教えてくれます。しかし、BBP とストライドも知る必要があります。

誰かが「なぜ ::GetBBP()... DUH を使用しないのですか」と言う前に、MSDN やその他のソースを何時間も検索した後、そのようなものをリモートで見つけることができませんでした。そして、非常に紛らわしい COM インターフェイスがたくさんあります。

私が見つけることができる唯一のものは、GUID を返す GetPixelFormat() であり、それを比較するために約 150 の "if (...)" ステートメントを記述します。3 つの値についてテストし、それらのいずれでもない場合は拒否できるようにするためです (1,8,32) これを処理する効率的な方法はほとんどありません。

また、GetPixelFormat() もストライドを教えてくれません。

これを行う方法はありますか?

(ビットマップも圧縮されていないため、IWICBitmapDecoder で実行する必要さえありませんが、IWICBitmap に「ここにブロブがあるので、サイズ xy のビットマップとして使用してください」と単純に伝える方法をまだ解明していません)

ご協力ありがとうございます。

-スコット

4

2 に答える 2

3

を使用しIWICPixelFormatInfoます。

メソッドからこのインターフェイスを取得できますIWICImagingFactory.CreateComponentInfo()

  • WICPixelFormatGUIDから取得した値を渡しますIWICBitmap.GetPixelFormat()
  • 上記のファクトリ メソッドによって返されたインターフェイス ポインターで使用QueryInterface( __uuidof(IWICPixelFormatInfo))して、インターフェイス ポインターを取得します。IWICComponentInfoIWICPixelFormatInfo
  • IWICPixelFormatInfo次に、ポインタに尋ねることができますGetBitsPerPixel()

それをピクセルあたりのバイト数に変換すれば完了です。

読み取りロックを取得するよりも少し複雑ですが、それでも代替手段です。

疑似コード

//Get the PixelFormatInfo for the bitmap's particular format
CLSID pixelFormat = bitmapSource.GetPixelFormat();
IWicComponentInfo componentInfo = WicFactory.CreateComponent(pixelFormat);
IWICPixelFormatInfo info = componentInfo as IWICPixelFormatInfo;

//Get the number of bytes per pixel (e.g. 32bpp -> 4 bytes)
UInt32 bitsPerPixel = info.GetBitsPerPixel();
Int32 bytesPerPixel = bitsPerPixel / 8;

//Calculate the format's stride
UInt32 width;
UInt32 height;
bitmapSource.GetSize(out width, out height);
Int32 stride = width * bytesPerPixel;
于 2015-12-17T18:15:36.193 に答える