2012-02-24 15 views
1

カメラのメタデータをビットマップにコピーしようとしていますが、メタデータの各値が16ビット(またはushort)であるため、16bpp garyscaleビットマップ。次のように私が書いたコードは次のとおりです。Cでポインタで16bppを正しくアドレス指定する方法

// Getting the metadata from the device 
metaData = new DepthMetaData(); 
dataSource.GetMetaData(metaData); 

// Setting up bitmap, rect and data to use pointer 
Bitmap bitmap = new Bitmap(metaData.XRes, metaData.YRes, PixelFormat.Format16bppGrayScale); 
Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height); 
BitmapData data = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format16bppGrayScale); 

// Pointer pointing to metadata 
ushort* ptrMetaData = (ushort*)dataSource.DepthMapPtr.ToPointer(); 

lock(this) 
{ 
    // Runs through the whole bitmap and assigns the entry in the metadata 
    // to a pixel 
    for (int y = 0; y < bitmap.Height; ++y) 
    { 
     ushort* ptrDestination = (ushort*)data.Scan0.ToPointer() + y * data.Stride; 
     for (int x = 0; x < bitmap.Width; ++x, ++ptrMetaData) 
     { 
      ptrDestination[x] = (ushort)*ptrMetaData; 
     } 
    } 
} 

// Once done unlock the bitmap so that it can be read again 
bitmap.UnlockBits(data); 

= 480 = 640メタデータのXRESを実行しているとYResコードは、forループ「ptrDestination [X] =(USHORT)*上のメモリアクセス例外がスローされますptrMetaData; "全体の半分である240本だけを走らせた後、ライン。

私は解像度を下げたところで8bppでこれを使用しました。うまくいきましたので、なぜここにはいけないのか分かりません。たぶん誰かが問題を見つけます。

おかげで既に

+0

NB:8bppのために私はバイトの代わりUSHORTを使用してピクセルに –

答えて

2
ushort* ptrDestination = (ushort*)data.Scan0.ToPointer() + y * data.Stride; 

data.Stride値はバイトではなくushortsで発現されます。したがって、ポインタは2の倍率でオフになるので、ビットマップで爆弾を出します。高さ/ 2。あなたのforループは壊れています、bitmap.Widthとbitmap.Heightを交換してください。 lockキーワードはあまり意味がありません。データソース以外のスレッドローカルデータにアクセスしています。修正:

for (int y = 0; y < bitmap.Height; ++y) 
{ 
    ushort* ptrDestination = (ushort*)data.Scan0.ToPointer() + y * data.Stride/2; 
    for (int x = 0; x < bitmap.Width; ++x, ++ptrMetaData) 
    { 
     ptrDestination[x] = (ushort)*ptrMetaData; 
    } 
} 
+0

Hieghtと幅を割り当てる前に、メタデータを8回rightshiftedが、私は明らかにメモ帳++にものをコピーすることはできませんので、スワップが、ストライドでした明確な解決策!どうもありがとう :) –

関連する問題