У меня есть инструмент с ползунками на трекбаре, который используется для настройки яркости, контрастности, гаммы и т. Д. Изображения.
Я пытаюсь получать обновления моего изображения в реальном времени, пока пользователь перетаскивает ползунок. Алгоритмы яркости и гаммы имеют приемлемую скорость (около 170 мс). Но алгоритм контрастности составляет около 380 мс.
В основном моя форма - это окно инструментов с ползунками. Каждый раз, когда изображение обновляется, оно отправляет событие родительскому объекту, который перерисовывает новое изображение. Окно инструментов сохраняет исходное немодифицированное изображение заблокированным в памяти, поэтому у меня всегда есть доступ к его байтам. По сути, я делаю это каждый раз, когда изменяется событие ValueChanged для ползунка (например, ползунка Contrast).
Код:
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 вместо одного цикла.