Вы получите несколько ударов скорости, если OpenMP на вашем радаре. OpenMP - многопоточная библиотека для неуправляемого C / C ++, для эффективной работы требуется поддержка компилятора. Не вариант в C #.
Давайте сделаем шаг назад. То, что у тебя сейчас, настолько плохо, насколько ты можешь себе представить. Get / SetPixel () ужасно медленный. Основным шагом будет использование Bitmap.LockBits (), он дает вам IntPtr для битов битовой карты. Вы можете использовать эти биты с помощью небезопасного байтового указателя. Это будет как минимум на порядок быстрее.
Давайте сделаем еще один шаг назад, вы четко пишете код для преобразования цветного изображения в изображение в оттенках серого. Цветовые преобразования изначально поддерживаются GDI + через класс ColorMatrix. Этот код может выглядеть так:
public static Image ConvertToGrayScale(Image srce) {
Bitmap bmp = new Bitmap(srce.Width, srce.Height);
using (Graphics gr = Graphics.FromImage(bmp)) {
var matrix = new float[][] {
new float[] { 0.299f, 0.299f, 0.299f, 0, 0 },
new float[] { 0.587f, 0.587f, 0.587f, 0, 0 },
new float[] { 0.114f, 0.114f, 0.114f, 0, 0 },
new float[] { 0, 0, 0, 1, 0 },
new float[] { 0, 0, 0, 0, 1 }
};
var ia = new System.Drawing.Imaging.ImageAttributes();
ia.SetColorMatrix(new System.Drawing.Imaging.ColorMatrix(matrix));
var rc = new Rectangle(0, 0, srce.Width, srce.Height);
gr.DrawImage(srce, rc, 0, 0, srce.Width, srce.Height, GraphicsUnit.Pixel, ia);
return bmp;
}
}
Кредит Боб Пауэлл за вышеуказанный код.