Как нарисовать субпиксельную линию - PullRequest
12 голосов
/ 03 марта 2012

В следующем коде я пытаюсь нарисовать две линии: одну с шириной субпикселя (0,5), а другую с шириной 1px:

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

Однако на сгенерированном изображении обе линии имеют одинаковую ширину:

enter image description here

Есть ли способ, чтобы верхняя строка отображалась на субпикселе (0,5 пикселя)?

Редактировать: После некоторого исследования, AGG может быть путь, из которого есть c # порт .

Ответы [ 4 ]

7 голосов
/ 03 марта 2012

Вы можете взломать его, нарисовав все х2, а затем уменьшить его:

        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

1 голос
/ 03 марта 2012

Согласно документации для Pen ,

Свойство Width установлено на значение, указанное в параметре width.Ширина 0 приведет к рисованию пером, как если бы ширина была 1.

Возможно, это относится к любой ширине меньше единицы, а не только к ширине, которая точно равна 0.

0 голосов
/ 03 марта 2012

В этой статье упоминается ошибка в GDI + Pen, из-за которой невозможно правильно уменьшить масштаб при ширине меньше 1.5.

Также, если вы попытаетесь нарисовать три линиис шириной 2.0F, 2.5F и 3.0F соответственно вы увидите визуальную разницу, поэтому ваш случай действительно выглядит как проблема с GDI +.

Three Pens with 0.5 width increment

0 голосов
/ 03 марта 2012

Я не думаю, что в данном случае имеет смысл использовать субпиксель.Вы все равно экспортируете его в файл изображения.Вместо этого попробуйте большее значение ширины.

...