GetPixel не очень быстрый способ доступа к данным изображения. Используйте метод LockBits .
EDIT:
Ну, ты много делаешь со строками. Создание словаря pixelData таким способом довольно бесполезно, почему бы вам сразу не обработать отдельные цвета? Цвет является неизменной структурой, так что это хороший ключ для нашего словаря.
Dictionary<Color, int> frequency = new Dictionary<Color, int>();
for (int i = 0; i < image.Height; i++) {
for (int j = 0; j < image.Width; j++) {
pixel = image.GetPixel(i, j);
if (frequency.ContainsKey(pixel)) frequency[pixel]++;
else frequency.Add(pixel, 1);
}
}
// and finally
int totalPixels = image.Width * image.Height;
foreach (var kvp in frequency) {
Console.WriteLine("Color (R={0},G={1},B={2}): {3}", kvp.Key.R, kvp.Key.G, kvp.Key.B, kvp.Value / (double)totalPixels);
}
И это должно быть сделано, за исключением случаев, когда вы хотите сделать это еще быстрее и использовать LockBits вместо GetPixel.
Некоторые другие наблюдения:
int hmm = (image.Height * image.Width);
double offset = 100 / double.Parse(hmm.ToString());
Вы используете очень странный и медленный способ приведения из int в double. Вы можете просто написать double offset = 100 / (double)hmm;
, и это то же самое (вы также можете написать 100.0, а не 100, и компилятор создаст для вас double, так что вам не нужно приводить hmm).
Это заставило меня смеяться:
IEnumerable<string> query = pixelData.Values.Where(fruit => fruit == value);
Почему фрукты !? Похоже, вы скопировали это откуда-то.