Алгоритм более быстрой контрастности для растрового изображения

У меня есть инструмент с ползунками на трекбаре, который используется для настройки яркости, контрастности, гаммы и т. Д. Изображения.

Я пытаюсь получать обновления моего изображения в реальном времени, пока пользователь перетаскивает ползунок. Алгоритмы яркости и гаммы имеют приемлемую скорость (около 170 мс). Но алгоритм контрастности составляет около 380 мс.

В основном моя форма - это окно инструментов с ползунками. Каждый раз, когда изображение обновляется, оно отправляет событие родительскому объекту, который перерисовывает новое изображение. Окно инструментов сохраняет исходное немодифицированное изображение заблокированным в памяти, поэтому у меня всегда есть доступ к его байтам. По сути, я делаю это каждый раз, когда изменяется событие ValueChanged для ползунка (например, ползунка Contrast).

  • LockBits рабочего (целевого) растрового изображения как Format24bppRgb (исходное растровое изображение находится в Format32bppPArgb)
  • Marshal. Скопируйте биты в массив байтов []
  • Проверьте, какую операцию я выполняю (какой ползунок был выбран)
  • Используйте следующий код для контраста:

Код:

double newValue = 0;
double c = (100.0 + contrast) / 100.0;

c *= c;

for (int i = 0; i < sourcePixels.Length; i++)
{
    newValue = sourcePixels[i];

    newValue /= 255.0;
    newValue -= 0.5;
    newValue *= c;
    newValue += 0.5;
    newValue *= 255;

    if (newValue < 0)
        newValue = 0;
    if (newValue > 255)
        newValue = 255;

    destPixels[i] = (byte)newValue;
}

Я однажды читал об использовании целых чисел вместо значений с плавающей запятой для увеличения скорости контраста, но мне не удалось найти эту статью снова.

Я пробовал использовать небезопасный код (указатели), но на самом деле заметил снижение скорости. Я предполагаю, что это произошло потому, что код использовал вложенные циклы for для повторения x и y вместо одного цикла.

5
задан Emil 1 November 2012 в 08:42
поделиться