[Из песочницы] Замена медленного Bitmap.GetPixel при получении HSB-характеристик изображения

Так уж получилось, что мне надо было написать маленькую программку для получения HSB-характеристик изображения. Самое тривиальное решение пришло в голову сразу: public struct HSB { public float H, S, B; }

public static HSB GetHSB (Bitmap img) { HSB imgHSB = new HSB (); int width = img.Width, height = img.Height; int pixelsCount = height * width;

for (int i = 0; i < pixelsCount; i++) { int y = i / width, x = i % height; imgHSB.H += img.GetPixel(x, y).GetHue(); imgHSB.S += img.GetPixel(x, y).GetSaturation(); imgHSB.B += img.GetPixel(x, y).GetBrightness(); }

imgHSB.H /= pixelsCount; imgHSB.S /= pixelsCount; imgHSB.B /= pixelsCount; return imgHSB; } Но оно не удовлетворило меня своей медлительностью: для изображения с размерами 2100×1500 пикселей метод выполнялся долгих 14209 мс. Оказалось, что во всем виноват метод Bitmap.GetPixel. Следовало искать другие, более быстрые способы.Читать дальше →

© Habrahabr.ru