Алгоритм контраста С# указатель на marshal.copy

Я пытался перевести этот код на vb.net, используя Marshal.copy, но не могу заставить его работать

for (int y = 0; y < bitmapdata.Height; y++)
{
    byte* destPixels = (byte*)bitmapdata.Scan0 + (y * bitmapdata.Stride);
    for (int x = 0; x < bitmapdata.Width; x++)
    {
        destPixels[x * PixelSize] = contrast_lookup[destPixels[x * PixelSize]]; // B
        destPixels[x * PixelSize + 1] = contrast_lookup[destPixels[x * PixelSize + 1]]; // G
        destPixels[x * PixelSize + 2] = contrast_lookup[destPixels[x * PixelSize + 2]]; // R
        //destPixels[x * PixelSize + 3] = contrast_lookup[destPixels[x * PixelSize + 3]]; //A
    }
}

Моя проблема в этой строке:

byte* destPixels = (byte*)bitmapdata.Scan0 + (y * bitmapdata.Stride);

person camaya    schedule 28.04.2012    source источник
comment
Аналогичный вопрос, stackoverflow.com/questions/ 13174323/   -  person Kratz    schedule 04.11.2012


Ответы (1)


Предполагая, что у вас есть Scan0 как IntPtr, тогда наивный перевод на С# просто:

IntPtr destPixels = Scan0 + y*stride;

Игроки здесь:

  • Scan0: указатель на первую строку развертки, т. е. начало пиксельных данных.
  • y: номер строки.
  • stride: количество байтов в строке пикселей.
  • destPixels: указатель на начало строки y.

Но это будет при условии, что вы используете неуправляемую память для destPixels. Я не знаю, ты или нет. Если вы используете управляемую память, перевод будет другим. Если вам нужна дополнительная помощь, сообщите нам о типах, которые использует ваша управляемая версия.

person David Heffernan    schedule 28.04.2012