如何在C#中用指针正确地寻址16bpp

本文关键字:指针 正确地 寻址 16bpp | 更新日期: 2023-09-27 18:25:53

我正试图将相机元数据复制到位图中,由于元数据中的每个值都是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降低了分辨率,效果很好,所以我不明白为什么不应该在这里。也许有人发现了问题。

已经感谢

如何在C#中用指针正确地寻址16bpp

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

数据。步幅值以字节表示,而不是以ushorts表示。所以指针偏离了2倍,所以它轰炸位图。Height/2.for循环已断开,请交换位图。宽度和位图。身高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;
    }
}