Как правильно обратиться 16bpp с указателями в C #
Вопрос
Я пытаюсь скопировать метаданные камеры в растровое изображение, и увидите, как каждое значение в метаданных - это 16bit (или USHORT), я подумал, что будет разумно отображать его в растровом кармане Garyscale 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 и YRES= 480. Код бросает исключение доступа к памяти в питании на «ptrdestination [x]= (Ushort) * Ptretadata;»После того, как он работает только через 240, половину всего, линии.
Я использовал это с 8bpp, где я сократил разрешение, и это работало красиво, поэтому я не понимаю, почему он не должен здесь.Может быть, кто-то находит проблему.
Спасибо уже
Решение
ushort* ptrDestination = (ushort*)data.Scan0.ToPointer() + y * data.Stride;
.
Данные. Значение данных выражается в байтах, а не Ushorts.Таким образом, указатель выключен в 2 раза, так что бомбы на Bitmap.height / 2.Ваши для петель сломаны, поменяйте Bitmap .Width и Bitmap.hight.Ключевое слово затвора здесь не имеет большого смысла здесь, вы получаете доступ к потоку локальные данные, кроме 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;
}
}
.