Как нарисовать линию подпикселя

В следующем коде я пытаюсь сделать две строки: одну с шириной подпикселя (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.5px)?

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

Ответ 1

В соответствии с документацией для Pen,

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

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

Ответ 2

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

        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

Ответ 3

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

Ответ 4

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

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

Three Pens with 0.5 width increment