Как правильно обратиться 16bpp с указателями в C #

StackOverflow https://stackoverflow.com/questions/9431209

  •  12-11-2019
  •  | 
  •  

Вопрос

Я пытаюсь скопировать метаданные камеры в растровое изображение, и увидите, как каждое значение в метаданных - это 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;
    }
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top