tengo una herramienta con controles deslizantes barra de seguimiento utilizados para ajustar de una imagen de brillo, contraste, gamma, etc.algoritmo de contraste más rápido para un mapa de bits
Estoy tratando de obtener actualizaciones en tiempo real a mi imagen mientras el usuario arrastra el control deslizante. Los algoritmos de brillo y gamma son una velocidad aceptable (alrededor de 170 ms). Pero el algoritmo de contraste es de aproximadamente 380 ms.
Básicamente mi formulario es una ventana de herramientas con controles deslizantes. Cada vez que se actualiza la imagen, envía un evento al padre que vuelve a dibujar la nueva imagen. La ventana de herramientas mantiene la imagen original no modificada bloqueada en la memoria para que siempre tenga acceso a los bytes de la misma. Básicamente, hago esto cada vez que se cambia el evento ValueChanged para un control deslizante (como el control deslizante Contraste).
- LockBits del mapa de bits de trabajo (destino) como Format24bppRgb (mapa de bits original se encuentra en Format32bppPArgb)
- Marshal.Copy los bits en un byte [] array
- Comprobar qué operación que estoy haciendo (que deslizador fue elegido)
- utilizar el siguiente código para el contraste:
código:
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;
}
Leí una vez sobre el uso de enteros en lugar de valores de coma flotante para aumentar la velocidad de contraste, pero no pude encontrar ese artículo de nuevo.
Intenté usar un código inseguro (punteros) pero en realidad noté una disminución de velocidad. Supongo que fue porque el código estaba usando ciclos anidados para iterar xey en lugar de un solo bucle.
posible duplicado de [Ajuste el contraste de una imagen en C# de forma eficiente] (http://stackoverflow.com/questions/3115076/adjust-the-contrast-of-an-image-inc-c-sharp-efficiently) – Magnus
El código inseguro en la pregunta a la que se vinculó, cuando lo pruebo con la misma imagen que estaba usando con mi código, toma más de 900ms por rutina. Por supuesto que lo modifiqué para que no clone ni cree mapas de bits nuevos, es solo el ciclo anidado con punteros y matemática de coma flotante. Es muy lento. –
Quizás pueda modificar su código para usar punteros en lugar de código inseguro. – Magnus