2012-03-02 19 views
11

Nel codice seguente, sto cercando di disegnare due linee: una con una larghezza subpixel (0,5) e l'altro con la larghezza 1px:Come disegnare una linea di subpixel

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

Tuttavia, nel generato immagine, entrambe le linee appaiono la stessa larghezza:

enter image description here

c'è un modo per la linea superiore appaia sub-pixel (0.5px)?

Edit: Dopo alcune ricerche, AGG potrebbe essere la strada da percorrere, di cui v'è una c# port.

+0

si prega di non inserire il prefisso vostri titoli con "C#" e così via. Ecco a cosa servono i tag. –

+0

Supponiamo che il tuo obiettivo abbia senso. Estrapolare, come ti aspetti una linea con una larghezza della penna di 0,001 pixel da guardare? –

+0

Se si ridimensiona un'immagine con una linea da 1 pixel utilizzando un'applicazione grafica, l'immagine risultante mostrerà una linea attenuata. –

risposta

1

Secondo la documentation for Pen,

La proprietà Width è impostato al valore specificato nel parametro di larghezza. Una larghezza di 0 comporterà disegno penna come se fosse la larghezza 1.

può essere che questo vale per qualsiasi larghezza minore di uno, non solo larghezze che sono esattamente pari a 0.

+0

Ah, avrebbe senso. – FredL

0

Non penso che abbia senso usare subpixel qui in questo caso. Lo stai esportando comunque in un file immagine. Prova invece un valore di larghezza maggiore.

+0

Vuoi dire che non è possibile disegnare una linea sub-pixel quando si esporta in un file immagine? – FredL

+0

Un file immagine è fondamentalmente una matrice di pixel. Come pensi che possa rappresentare le informazioni sub-pixel in esso contenute? – myin528

+0

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

0

This article menziona un bug in GDI + Pen che lo rende impossibile ridimensionarlo correttamente quando la sua larghezza è inferiore a 1.5.

Inoltre, se si tenta di disegnare tre linee con larghezze 2.0F, 2.5F e 3.0F rispettivamente, vedrete una differenza visiva, quindi il vostro caso sembra davvero un problema con GDI +.

Three Pens with 0.5 width increment

7

si potrebbe hack disegnando tutto x2 e poi scala verso il basso:

 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

Suggerimento interessante. Hai dimostrato che è possibile visualizzare le linee subpixel in un png. Sembra che sia solo una limitazione di GDI + che questo non può essere fatto senza ridimensionamento. – FredL

+0

Non è in realtà un subpixel, che di solito si riferisce alla tecnica di rendering che considera il sottofondo rosso blu e verde sottostante. Questa è solo una linea di larghezza frazionaria che dovrebbe essere possibile ovunque ma GDI + apparentemente non ha a che fare con la larghezza <1. Vedi http://freespace.virgin.net/hugo.Elias/Grafica/x_wuline.htm – gordy

Problemi correlati