2012-03-02 19 views
11

En el siguiente código, que estoy tratando de dibujar dos líneas: una con un ancho de subpíxeles (0,5) y el otro con un ancho de 1 píxel:Cómo dibujar una línea de subpíxeles

 var img = new Bitmap(256, 256); 
     Graphics graphics = Graphics.FromImage(img); 
     graphics.SmoothingMode = SmoothingMode.AntiAlias; 

     // Draw a subpixel line (0.5 width) 
     graphics.DrawLine(new Pen(Color.Red, (float)0.5), 0, 100, 255, 110); 

     // Draw a single pixel line (1 width) 
     graphics.DrawLine(new Pen(Color.Red, (float)1), 0, 110, 255, 120); 

     img.Save(@"c:\temp\test.png", ImageFormat.Png); 

     graphics.Dispose(); 

     img.Dispose(); 

Sin embargo, en el generada imagen, ambas líneas aparecen la misma anchura:

enter image description here

¿hay una manera para que la línea superior que aparezca sub-píxel (0.5px)?

Editar: Después de algunas investigaciones, AGG podría ser el camino a seguir, de los cuales hay un c# port.

+0

por favor no uses el prefijo sus títulos con "C#" y tal. Para eso son las etiquetas. –

+0

Supongamos que su objetivo tiene sentido. Extrapolar, ¿cómo espera que se vea una línea con un ancho de pluma de 0.001 píxeles? –

+0

Si reduce el tamaño de una imagen que tiene una línea de 1 píxel utilizando una aplicación de gráficos, la imagen resultante mostrará una línea atenuada. –

Respuesta

1

Según la documentation for Pen,

la propiedad Width se establece en el valor especificado en el parámetro de anchura. Una anchura de 0 resultará en el dibujo de la pluma como si el ancho eran 1.

puede ser que que se aplica a cualquier anchura menor que uno, no sólo anchuras que son precisamente igual a 0.

+0

Ah, eso tendría sentido. – FredL

0

No creo que tenga sentido utilizar subpixel aquí en este caso. Lo está exportando a un archivo de imagen de todos modos. Pruebe con un mayor valor de ancho en su lugar.

+0

¿Quiere decir que no es posible dibujar una línea subpíxel cuando se exporta a un archivo de imagen? – FredL

+0

Un archivo de imagen es básicamente una matriz de píxeles. ¿Cómo crees que puede representar información subpíxel en él? – myin528

+0

http://en.wikipedia.org/wiki/Subpixel_rendering#Examples – FredL

0

This article menciona un error en GDI + Pen que hace que no se pueda escalar correctamente cuando su ancho es menor que 1.5.

Además, si intenta dibujar tres líneas con anchos 2.0F, 2.5F y 3.0F respectivamente, verá una diferencia visual, por lo que su caso realmente se ve como un problema con GDI +.

Three Pens with 0.5 width increment

7

se podía entrar ilegalmente en él dibujando todo lo x2 y luego reduce la escala:

 Image img2x = new Bitmap(256*2, 256*2); 
     Graphics g2x = Graphics.FromImage(img2x); 
     g2x.SmoothingMode = SmoothingMode.AntiAlias; 
     g2x.DrawLine(new Pen(Color.Red, 0.5f*2), 0, 100*2, 255*2, 110*2); 

     Image img = new Bitmap(256, 256); 
     Graphics g = Graphics.FromImage(img); 
     g.SmoothingMode = SmoothingMode.AntiAlias; 
     g.DrawImage(img2x, 0, 0, 256, 256); 

     g.DrawLine(new Pen(Color.Red, 1f), 0, 110, 255, 120); 

     img.Save(@"c:\tmep\test.png", ImageFormat.Png); 

enter image description here

+0

Sugerencia interesante. Has demostrado que es posible mostrar líneas de subpixel en un png. Parece que es solo una limitación de GDI + que esto no se puede hacer sin reducir la escala. – FredL

+0

No es realmente un subpíxel, normalmente se refiere a la técnica de representación que considera el diseño subyacente de subpíxeles rojo, azul y verde. Esta es solo una línea de ancho fraccional que debería ser posible en cualquier lugar, pero aparentemente GDI + no se ocupa de ancho <1. Consulte http://freespace.virgin.net/hugo.elias/graphics/x_wuline.htm – gordy

Cuestiones relacionadas