2009-07-02 9 views
1

矩形をロックするときは、次の未回答の質問の繰り返しであってもよい。ロックポインタC#ビットマップ

Help with bitmap lock - Format8bppIndexed 

Iは、以下のように画像をロックだ:で

// PixelFormat is 8BppIndexed in my case. 
Bitmap bmp = new Bitmap("mySampleImage.tif"); 

// ClipRectangle will be a Rectangle such as {x=128, y=290, width=250, height=200}, 
// selected by the user by seeing the image on screen. Thus, it's a valid region 
BitmapData data = bmp.LockBits(rect, ImageLockMode.ReadOnly, bmp.PixelFormat); 

unsafe 
{ 
    byte* origin = (byte*)data.Scan0.ToPointer(); 

    // Processing... 
} 

を処理部Iは、ClipRectangle内の画素をY方向に巡回する。しかし、有効でなければならないピクセルは、メモリアクセスエラーで返され、ポインタを逆参照できないと言っています。使用704x600画像における例えば

ClipRectangle = {x=128, y=290, width=250, height=200}

画素(128x321)有効であるべきです。手動で中間ウィンドウでそのピクセルを取得するために数学を入力して、私は以下の取得:

origin + (321 * stride) + 128 
0x053a80c0 
    *(origin + (321 * stride) + 128): Cannot dereference 'origin + (321 * stride) + 128'. The pointer is not valid. 

ストライドが704である、私のソフトウェアのロジックは、中間ウィンドウとして正確なポインタの位置を思い付くので、すべてのものそうだ。 290から320までのYピクセルは逆参照できます。代わりにビットマップ全体をロックすると、すべての論理はうまくいきますが、正しいピクセルが得られているのか、LockBitsでどのようにロックされた四角形が使われているのか疑問に思っています。

必要な領域だけをロックすると、BitmapDataの予想されるロックされたピクセルにアクセスできないのはなぜですか?

答えて

3

あなたはオフセット、BitmapData.Scan0ビットマップ起源ではなく、指定した矩形の起源を返さないと四角形を使用してビットをロックします。あなたが使用している場合

ので、:

Rectangle rect = new Rectangle(128, 290, 250, 200); 
BitmapData data = bmp.LockBits(rect, ImageLockMode.ReadOnly, bmp.PixelFormat); 

はその後Scan0から最大オフセットは(250 * Stride) + 200です。

つまり、(128x321)のピクセルは(Scan0 + (321 - 290) * Stride)になります。

+0

私はこれが事実かもしれないと思っていましたが、投稿する前にこのことについてMSDNを吟味しましたが、見つけられませんでした。ありがとう。 –