У меня есть инструмент с элементами управления TrackBar ползунков используется для регулировки яркости, контрастности, гаммы изображение в и т.д.Faster алгоритм контраста для точечного рисунка
Я пытаюсь получить обновления в реальном времени, чтобы мой образ, когда пользователь перетаскивает слайдер. Яркость и гамма-алгоритмы являются приемлемой скоростью (около 170 мс). Но контрастный алгоритм составляет около 380 мс.
В основном моя форма - это окно с инструментами с ползунками. Каждый раз, когда изображение обновляется, оно отправляет событие родительскому объекту, который перерисовывает новое изображение. Окно инструмента сохраняет исходное немодифицированное изображение в памяти, поэтому я всегда имею доступ к его байтам. Поэтому в основном я делаю это каждый раз, когда изменяется событие ValueChanged для слайдера (например, слайдер Contrast).
- LockBits из рабочего (назначения) растрового изображения в качестве Format24bppRgb (исходное растровое изображение в Format32bppPArgb)
- Marshal.Copy биты в байте [] массив
- Проверьте, какую операцию я делаю (что слайдер был выбран)
- Используйте следующий код для контраста:
код:
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;
}
Я читал один раз об использовании целого числа вместо значений с плавающей запятой, чтобы увеличить скорость контраста, но я не смог найти эту статью снова.
Я попытался использовать небезопасный код (указатели), но на самом деле заметил снижение скорости. Я предполагаю, что это было потому, что код использовал вложенные для циклов для итерации x и y вместо одного цикла.
Возможный дубликат [Настроить контраст изображения на C# эффективно] (http://stackoverflow.com/questions/3115076/adjust-the-contrast-of-an-image-in-c-sharp-efficiently) – Magnus
Небезопасный код в вопросе, с которым вы связались, когда я тестирую его с тем же изображением, что и с моим кодом, занимает более 900ms за рутину. Конечно, я модифицировал его так, чтобы он не клонировал или не создавал новые растровые изображения, это всего лишь вложенный цикл с указателями и математикой с плавающей запятой. Это слишком медленно. –
Возможно, вы можете изменить свой код, чтобы использовать указатели вместо этого в небезопасном коде. – Magnus