1

BitmapData現在、ビットマップをロックした後に利用可能なを使用して、ビットマップのピクセル データを読み取っています。私が使用している方法は、各色のバイトを個別に読み取るためint、指定されたポインターで 4 バイトを直接読み取るよりも遅くなります。残念ながら、私のビットマップは 24bpp です。つまり、1 ピクセルあたり 4 バイトではなく 3 バイトです。3 バイトだけをすばやく読み取り、指定さintれたポインター アドレスにキャストする方法はありますか?

// read pixel color
byte* Pix = (byte*)bmpScan0 + (y * bmpStride) + (x * 3);
byte R = *(Pix + 2);
byte G = *(Pix + 1);
byte B = *(Pix);
int RGB = ((int)R << 16) | ((int)G << 8) | (int)B;
4

2 に答える 2

2

読み取り、マスキングなどの複数の操作の代わりに、ピクセルのアドレスで完全なintを読み取り、余分なバイトをマスクすることができます。

int Pix = *(int*)((byte*)bmpScan0 + (y * bmpStride) + (x * 3)) & 0x00FFFFFF;

エンディアンによっては、マスキングの代わりにシフトダウンする必要があり、カラーコンポーネントが逆になる場合があります(RGBではなくBGR)。

ああ、4バイトの境界に揃えられていないメモリからの読み取りが原因で、速度の問題が発生する可能性があります。それらを回避することはできますが、解決策は元の問題よりも悪いことがよくあります。

于 2013-02-26T06:59:58.653 に答える
-1

次のような意味です。

int foo = *(some pixel address in memory);
byte R = (byte)(foo & 0xff0000 >> 16);
byte G = (byte)(foo & 0x00ff00 >> 8);
byte B = (byte)(foo & 0xff);

編集: 他のコメントでの継続性を維持するために、この回答は未編集のままにしますが、質問自体の編集に基づいて適用できなくなります。:)

于 2013-02-26T06:36:02.860 に答える