Так уж получилось, что мне надо было написать маленькую программку для получения 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.
Следовало искать другие, более быстрые способы.
Читать полностью »