c# - rectangle - LinearGradientBrush Artifact ¿Alternativa?
gdi windows forms (4)
El LinearGradientBrush en .net (¿o incluso en GDI + como un todo?) Parece tener un error grave: a veces, introduce artefactos. (Vea aquí o aquí - esencialmente, la primera línea de un degradado lineal se dibuja en el color final, es decir, un gradiente de Blanco a Negro comenzará con una línea negra y luego con el gradiente adecuado de blanco a negro)
Me pregunto si alguien encontró una solución de trabajo para esto? Este es un error realmente molesto :-(
Aquí hay una imagen de los artefactos, tenga en cuenta que hay 2 LinearGradientBrushes:
texto alternativo http://img142.imageshack.us/img142/7711/gradientartifactmm6.jpg
Me di cuenta de esto también cuando uso cepillos de gradiente. La única solución efectiva que tengo es crear siempre el rectángulo del pincel de degradado 1 píxel más grande en todos los bordes que el área que se va a pintar con él. Eso lo protege contra el problema en los cuatro bordes. La desventaja es que los colores utilizados en los bordes son una fracción de los que especifique, ¡pero esto es mejor que el problema del artefacto de dibujo!
Puede usar el buen método Inflate (int i) en un rectángulo para obtener la versión más grande.
Al menos con WPF podría intentar usar GradientStop
s para obtener el 100% de colores correctos en los bordes, incluso cuando esté sobrepintado.
Me refiero a la respuesta de Phil anterior (esto es realmente un comentario, pero no tengo ese privilegio). El comportamiento que veo es contrario a la documentación , que dice:
La línea de salida es perpendicular a la línea de orientación y pasa a través de una de las esquinas del rectángulo. Todos los puntos en la línea de partida son el color inicial. Entonces, la línea final es perpendicular a la línea de orientación y pasa a través de una de las esquinas del rectángulo. Todos los puntos en la línea final son el color final.
A saber, en algunos casos obtiene un ajuste de píxeles único. Por lo que puedo decir (por experimentación) solo obtengo el problema cuando el ancho o alto del rectángulo es impar. Así que para evitar el error, creo que es adecuado aumentar el rectángulo LinearGradientBrush en 1 píxel si y solo si la dimensión (antes de la expansión) es un número impar. En otras palabras, siempre redondee el rectángulo del pincel hasta el siguiente número par de píxeles en ancho y alto.
Entonces para llenar un rectángulo r
uso algo como:
Rectangle gradientRect = r;
if (r.Width % 2 == 1)
{
gradientRect.Width += 1;
}
if (r.Height % 2 == 1)
{
gradientRect.Height += 1;
}
var lgb = new LinearGradientBrush(gradientRect, startCol, endCol, angle);
graphics.FillRectangle(lgb, r);
Loco pero cierto.