2012-02-24 1 views
1

Я пытаюсь скопировать метаданные камеры в растровое изображение, и, когда каждое значение в метаданных является 16-битным (или ядром), я думал, что было бы разумно отображать его в 16bpp Растровое изображение garyscale. Код, который я написал следующим образом:Как правильно адресовать 16bpp с указателями в C#

// 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 [х] = (UShort) * ptrMetaData;» после того, как он работает всего 240, половина всего, линии.

Я использовал это с 8bpp, где я уменьшил разрешение, и это сработало красиво, поэтому я не понимаю, почему этого не должно быть здесь. Может быть, кто-то найдет проблему.

Спасибо уже

+0

NB: Для 8bpp я использовал байты вместо USHORT и rightshifted метаданных 8 раз перед назначением на пиксель –

ответ

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

Значение data.Stride выражается в байтах, а не ushorts. Таким образом, указатель отключается в 2 раза, поэтому он бомбит битмап. Высота/2. Ваши петли разбиты, swap bitmap.Width и bitmap.Height. Ключевое слово блокировки здесь не имеет особого смысла, вы получаете доступ к локальным данным потока, отличным от dataSource. Fix:

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 и ширина поменялись местами, потому что я, видимо, не могу копировать вещи в Notepad ++, но Stride был определенное решение! Большое спасибо :) –