В ответ на Джона sH я сделал для вас пример. В этом примере используется тип Span. Это может быть сделано непосредственно с массивом или ArraySegment<byte>
.
Это пример того, как вы можете обрабатывать многопоточные строки:
private void Main()
{
int width = 1024;
int height = 768;
int channelCount = 3;
// create a buffer
var data = new byte[width * height * channelCount];
// fill with some data
// example: 0, 1, 2, 3, 4, 5, 6
PutSomeValuesInThatBuffer(data);
// process the image and specify a line-edit callback
// transforms to: 255, 254, 253, 252, 251, 250
ProcessImage(data, width, height, channelCount, linePixels =>
{
int offset = 0;
// we need to loop all pixel on this line
while (offset < linePixels.Length)
{
// for RGB | R = channel[0], G = channel[1], B = channel[2], etc...
// lets invert the colors, this loop isn't quite necessary
// but it shows the use of channels (R, G, B)
for (int i = 0; i < channelCount; i++)
{
linePixels[offset] = 255 - linePixels[offset];
offset++;
}
}
});
}
public delegate void LineProcessorAction(Span<byte> line);
// this is the process method which will split the data into lines
// and process them over multiple threads.
private void ProcessImage(
byte[] data,
int width, int height, int channelCount,
LineProcessorAction lineProcessor)
{
var rowSizeInBytes = width * channelCount;
Parallel.For(0, height, index =>
lineProcessor(new Span<byte>(data, index * rowSizeInBytes, rowSizeInBytes)));
}
private static void PutSomeValuesInThatBuffer(byte[] data)
{
for (int i = 0; i < data.Length; i++)
data[i] = (byte)i;
}