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