2012-02-24 65 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); 

當運行元數據的XRES = 640和Y殘餘物= 480.代碼拋出在for循環的存儲器存取的異常的「ptrDestination [X] =(USHORT)* ptrMetaData;」雖然只運行240,一半的線路。

我用這個8bpp,我減少了分辨率,它很好地工作,所以我不明白爲什麼它不應該在這裏。也許有人發現這個問題。

由於已經

+0

注:對於8bpp的我用字節而不是USHORT和分配給Hieght和寬度交換,因爲我顯然不能的東西複製到記事本++像素 – 2012-02-24 13:02:18

回答

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

的data.Stride值以字節爲單位,不ushorts表示。所以指針偏離了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; 
    } 
} 
+0

之前rightshifted元數據的8倍,但步幅是明確的解決方案!非常感謝 :) – 2012-02-24 13:26:21

相關問題