Vraag Hoe een subpixellijn te tekenen


In de volgende code probeer ik twee lijnen te tekenen: een met een subpixelbreedte (0,5) en de andere met 1 px breedte:

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

In de gegenereerde afbeelding zien beide lijnen er echter hetzelfde uit:

enter image description here

Is er een manier om de bovenste regel subpixel (0,5 px) te laten verschijnen?

Bewerk: Na wat onderzoek, AGG is misschien de manier om te gaan, waarvan er een is c # poort.


11
2018-03-02 23:01


oorsprong


antwoorden:


Volgens de documentatie voor Pen  ,

De eigenschap Width wordt ingesteld op de waarde die is opgegeven in de parameter width. Een breedte van 0 resulteert in de pentekening alsof de breedte 1 was.

Het kan zijn dat dit geldt voor elke breedte kleiner dan één, niet alleen voor breedten die precies gelijk zijn aan 0.


1
2018-03-03 00:24



Je zou het kunnen hacken door alles x2 te tekenen en het vervolgens naar beneden te schalen:

        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


7
2018-03-03 00:34



Ik denk niet dat het logisch is om hier in dit geval subpixels te gebruiken. U exporteert het hoe dan ook naar een afbeeldingsbestand. Probeer in plaats daarvan een grotere breedtewaarde.


0
2018-03-02 23:14



Dit artikel vermeldt een fout in GDI + Pen waardoor deze niet correct kan worden verkleind wanneer de breedte kleiner is dan 1.5.

Ook als u probeert drie lijnen met breedtes te tekenen 2.0F, 2.5F en 3.0F respectievelijk ziet u een visueel verschil, dus uw case lijkt echt op een probleem met GDI +.

Three Pens with 0.5 width increment


0
2018-03-03 00:19