2008-09-21 9 views
9

El LinearGradientBrush en .net (o incluso en GDI + en general?) Parece tener un error grave: a veces, introduce artefactos. (Ver here o here - esencialmente, la primera línea de un gradiente lineal se dibuja en el EndColor, es decir, un gradiente de blanco a Negro comenzará con una línea Negro y después con el buen gradiente de blanco a Negro)LinearGradientBrush Artefacto Solución?

Me pregunto si alguien encontró una solución de trabajo para esto? Esto es un error muy molesto :-(

Aquí está una foto de los artefactos, tenga en cuenta que hay 2 LinearGradientBrushes:.

alt text http://img142.imageshack.us/img142/7711/gradientartifactmm6.jpg

+0

impresionante, por lo que ahora aparece por primera vez para la mayoría de mis búsquedas wtf :) –

+0

estado tomando el pelo hacia fuera sobre esto durante una hora – Antony

Respuesta

9

que he notado esto también cuando se utiliza cepillos de gradiente El único La solución efectiva que tengo es crear siempre el rectángulo de 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. El inconveniente es que los colores utilizados en el los bordes son una fracción de los que especifique, ¡pero esto es mejor que el problema del artefacto de dibujo!

+0

Para mis propósitos, que funciona y ahora los artefactos son finalmente desaparecido \ o/ –

5

Puede usar el método agradable Inflate (int i) en un rectángulo para obtener la versión más grande.

+0

lo hice ni siquiera sabes esa función. ordenado :) –

1

Al menos con WPF puede intentar usar el GradientStop s para obtener el 100% de los colores correctos justo en los bordes, incluso cuando está sobrepintado.

2

Me refiero a la respuesta de Phil anterior (esto es realmente un comentario, pero no tengo ese privilegio). El comportamiento veo es contrario a the documentation, que dice:

línea La partida 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.

En algunos casos, obtendrá un ajuste de un solo píxel. 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.

Así que para llenar un rectángulo r utilizo 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); 

insana pero cierto.

Cuestiones relacionadas