2017-05-22 4 views
0

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に私が手コードと例外を実行します。

は、保護されたメモリを読み書きしようとしました。これはしばしば、他のメモリが壊れていることを示します。

私のポインタロジックで何かが間違っていると思います....しかし、何が見つかりません。

誰でも問題が表示されますか?

ありがとうございます。

答えて

0

私はあなたの最初のオフセットにあなたの+ rect.Xの問題があると思います。

2番目のforループでrect.Xから始めるので、最初に追加する必要はありません。

+0

私もそうだと思っていましたが、オフセットの 'rect.X'を削除すると、' if'条件が成立しませんでした。**画像にはいくつかのピクセルがあります。私は私の目で見る...) – Slashy

+0

私のせい...それは実際に働く!ありがとう – Slashy

関連する問題