Lockbits с более короткими значениями серого - PullRequest
1 голос
/ 29 марта 2011

Я хочу создать растровое изображение из заданных 16-битных значений оттенков серого.Пока у меня есть этот код:

var value = CamData.ToArray();

        var b = new Bitmap(160, 112, PixelFormat.Format24bppRgb);
        var bdata = b.LockBits(new Rectangle(0, 0, 160, 112), ImageLockMode.WriteOnly, b.PixelFormat);

        unsafe
        {
            fixed (ushort* pData = &value[0])
            {
                Marshal.Copy((IntPtr)pData, new IntPtr[]{ bdata.Scan0}, 0, value.Length);
            }
        }
        b.UnlockBits(bdata);

, но я получаю ошибку в методе Marshal.Copy: «Запрошенный диапазон находится за концом массива».Где ошибка?

спасибо

Ответы [ 2 ]

1 голос
/ 29 марта 2011

Вы не можете копировать в область памяти, определенную указателем: вам нужно передать реальный массив , а не указатель на массив. Вы передаете массив размером 1 IntPtr, и это не будет работать.

0 голосов
/ 29 марта 2011

bdata.Scan0 - это IntPtr, который указывает на начало заблокированной области памяти.Вы не должны оборачивать это в массив.И вы можете использовать Marshal.Copy с массивом в качестве источника.Таким образом, ваш код может быть:

Marshal.Copy(value, 0, bdata.Scan0, value.Length);

Это будет использовать это перегрузка Marshal.Copy .

...