RGBA
の値が2 32bpp
のイメージ(1920X1080の場合)を比較し、そのビットで何らかの操作を実行しようとしています(問題にはあまり関係ありません) 。ポインタを介してビットマップピクセルを処理する
最初に希望するピクセルへのポインタint
を使用して、一度に4バイトを比較します。
は、これは私のコードです:
private unsafe void Process(byte[] prev, byte[] curr, Rectangle rect)
{
fixed (byte* image1BasePtr = prev, image2BasePtr = curr)
{
int offset = (rect.Y * mainBmp.Width) + rect.X;
int* prevPtr = (int*)image1BasePtr;
prevPtr += offset;
int* currPtr = (int*)image2BasePtr;
currPtr += offset;
int toY = rect.Y + rect.Height;
int toX = rect.X + rect.Width;
for (int y = rect.Y; y < toY; y++)
{
for (int x = rect.X; x < toX; x++)
{
if (currPtr[x] != prevPtr[x]) // Compare 4 bytes at once.
{
//Here i do somthing..doesn't really matter what
}
}
prevPtr += mainBmp.Width; // Advance pointers to the next line.
currPtr += mainBmp.Width;// Advance pointers to the next line.
}
}
}
私は全体の画像を処理したくない場合は、処理するための特定の領域を選択することができます。
これは、(例えば)の呼び出しです。この場合は
Process(rgbprev, rgbcurr, new Rectangle(1000, 0, 920, 1080));
、スキャンはビットマップ(私の場合は1920)の最後に、最初から、1000年のピクセルから開始します行(Y=0
)から最後の行まで
私はy=1079 and x=1630
に私が手コードと例外を実行します。
は、保護されたメモリを読み書きしようとしました。これはしばしば、他のメモリが壊れていることを示します。
私のポインタロジックで何かが間違っていると思います....しかし、何が見つかりません。
誰でも問題が表示されますか?
ありがとうございます。
私もそうだと思っていましたが、オフセットの 'rect.X'を削除すると、' if'条件が成立しませんでした。**画像にはいくつかのピクセルがあります。私は私の目で見る...) – Slashy
私のせい...それは実際に働く!ありがとう – Slashy