Это не так, как lockBits
работает
Короче говоря, вам нужно заблокировать биты, чтобы получить доступ к линии сканирования через указатели.Лучше всего использовать 32bpp для целочисленного доступа.Вы можете вычислить пиксель в соответствующем массиве следующим образом:
. Вам нужно будет украсить свой класс или метод с помощью ключевого слова unsafe
, а также установить опцию сборки проекта для использования небезопасного кода., вы используете указатели.
var w = bmp.Width;
var h = bmp.Height;
// lock the array for direct access
var data = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format32bppPArgb);
var scan0Ptr = (int*)data.Scan0;
// get the stride
var stride = data.Stride / 4;
// scan all x
for (var x = 0; x < w; x++)
{
var pX = scan0Ptr + x;
// scan all y
for (var y = 0; y < h; y++)
{
// this is now your pixel *p, which essentially is a pointer to
// to a memory which contains your pixel
var p = pX + y * stride;
// or for better access to X and Y
var p = scan0Ptr + x + y * stride;
// or alternatively you can just access you pixel with the following notation
*(scan0Ptr + x + y * stride) // <== just use this like any variable
// example how to convert pixel *p to a Color
var color = Color.FromArgb(*p);
// example Convert a Color back to *p and update the pixel
*p = Color.White.ToArgb();
}
}
// unlock the bitmap
bmp.UnlockBits(data);
Остальные детали я оставляю на ваше усмотрение, однако это даст вам наилучшую производительность (за исключением некоторых микрооптимизаций).
Наконец, сокращение вызововвнешние методы также дадут вам повышение производительности, однако, если вам действительно это нужно, вы можете помочь CLR, используя MethodImplOptions
Enum для AggressiveInlining
Например,
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private Color durchschnitt(Color c1, Color c2, Color c3, Color c4)
Также вы можете получить повышение производительности, переместив компоненты, просто мысль
var r = ((*p >> 16) & 255);
var g = ((*p >> 8) & 255);
var b = ((*p >> 0) & 255);
И просто мысль, что вы могли бы, вероятно, многопоточность этой рабочей нагрузки