1

カメラのメタデータをビットマップにコピーしようとしていますが、メタデータの各値が 16 ビット (または ushort) であるため、16bpp の garyscale ビットマップで表示するのが賢明だと思いました。私が書いたコードは次のとおりです。

// 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);

メタデータの XRes = 640 および YRes = 480 を実行すると、コードは "ptrDestination[x] = (ushort)*ptrMetaData;" の for ループでメモリ アクセス例外をスローします。合計の半分の 240 行を実行しただけです。

これを 8bpp で使用して解像度を下げたところ、うまく機能したので、ここで使用しない理由がわかりません。多分誰かが問題を見つけます。

もうありがとう

4

1 に答える 1

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

data.Stride 値は、ushort ではなくバイトで表されます。したがって、ポインタは 2 倍ずれているため、bitmap.Height/2 で爆発します。for ループが壊れています。bitmap.Width と bitmap.Height を交換してください。ここでは lock キーワードはあまり意味がありません。dataSource 以外のスレッド ローカル データにアクセスしています。修理:

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;
    }
}
于 2012-02-24T13:09:27.413 に答える