Cómo dibujar una línea de subpíxeles

En el siguiente código, estoy intentando dibujar dos líneas: una con un ancho de subpíxel (0.5) y la otra con un ancho de 1 px

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 la imagen generada, ambas líneas tienen el mismo ancho:

introduzca la descripción de la imagen aquí

¿Hay alguna forma de que aparezca la línea superior subpíxel (0.5 px)?

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

Según la documentación de Pen ,

La propiedad Width se establece en el valor especificado en el parámetro width. Un ancho de 0 resultará en el dibujo de la pluma como si el ancho fuera 1.

Puede ser que eso se aplique a cualquier ancho menor que uno, no solo a anchos que sean exactamente iguales a 0.

Puedes hackearlo dibujando todo x2 y luego reducirlo:

  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); 

introduzca la descripción de la imagen aquí

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

Este artículo menciona un error en GDI + Pen que lo hace incapaz de escalar correctamente cuando su ancho es inferior a 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 parece un problema con GDI +.

Tres bolígrafos con 0.5 incrementos de ancho

    Intereting Posts