GDI+ как изменить линию SmoothingMode?

можно ли изменить PowerPacks.LineShape smoothingMode?

Я пытался использовать этот код(класс, который наследует LineShape):

  Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    Dim g As Graphics = e.Graphics   

    ' no difference when changing the SmoothingMode ' 
    g.SmoothingMode = SmoothingMode.AntiAlias 

    Using pen As New Pen(Color.Blue, 3)
      g.DrawLine(pen, X1, Y1, X2, Y2)
    End Using

    ' MyBase.OnPaint(e) '
  End Sub

у меня всегда один и тот же результат, как это: alt текст http://lh6.ggpht.com/_1TPOP7DzY1E/S3v1IbxlbCI/AAAAAAAADD4/q1Y9kP8wJ0g/s800/Capture2.png

=======

редактировать

обновил тест:

  Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    Dim g As Graphics = e.Graphics

    Dim oldmode As SmoothingMode = g.SmoothingMode

    Using pen As New Pen(Color.Blue, 3)
      g.SmoothingMode = SmoothingMode.AntiAlias
      g.DrawLine(pen, X1, Y1, X2, Y2)
      g.SmoothingMode = SmoothingMode.None
      g.DrawLine(pen, X1 + 50, Y1, X2 + 50, Y2)
    End Using

    g.SmoothingMode = oldmode
    g.Flush()

    'MyBase.OnPaint(e)'
  End Sub

результат (не берем в рассмотрение этикеток и кружков):

alt текст http://lh3.ggpht.com/_1TPOP7DzY1E/S447qYvTqzI/AAAAAAAADE8/eP3kCLqQJbk/s800/Capture2.png

видимо сглаживания не принимается невниманием...

4 ответов


SmoothingMode должен определенно повлиять на ваш выход

вот некоторые настройки, которые я недавно использовал для изменения размера изображения с минимальной потерей качества:

graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

InterpolationMode, вероятно, не имеет отношения к вашему примеру, но PixelOffsetMode может быть. Позвольте мне запустить быстрое тестовое приложение.

обновление: вот приложение быстрого тестирования, SmoothingMode определенно влияет на линии I рисовать.

private void Form1_Load(object sender, EventArgs e)
{
    foreach (var value in Enum.GetValues(typeof(SmoothingMode)))
    {
        _ComboBoxSmoothingMode.Items.Add(value);
    }

    foreach (var value in Enum.GetValues(typeof(PixelOffsetMode)))
    {
        _ComboBoxPixelOffsetMode.Items.Add(value);
    }

    _ComboBoxPixelOffsetMode.SelectedIndex = 0;
    _ComboBoxSmoothingMode.SelectedIndex = 0;
}

private void _ButtonDraw_Click(object sender, EventArgs e)
{
    using (Graphics g = _LabelDrawing.CreateGraphics())
    {
        g.Clear(Color.White);

        if (_ComboBoxPixelOffsetMode.SelectedItem != null && (PixelOffsetMode)_ComboBoxPixelOffsetMode.SelectedItem != PixelOffsetMode.Invalid)
        {
            g.PixelOffsetMode = (PixelOffsetMode)_ComboBoxPixelOffsetMode.SelectedItem;
        }

        if (_ComboBoxSmoothingMode.SelectedItem != null && (SmoothingMode)_ComboBoxSmoothingMode.SelectedItem != SmoothingMode.Invalid)
        {
            g.SmoothingMode = (SmoothingMode)_ComboBoxSmoothingMode.SelectedItem;
        }

        using (Pen pen = new Pen(Color.Blue, 3))
        {
            g.DrawLines(pen, new[] { new Point(0, 0), new Point(25, 50), new Point(_LabelDrawing.Width - 25, _LabelDrawing.Height - 50), new Point(_LabelDrawing.Width, _LabelDrawing.Height), });
        }
    }
}

SmoothingMode: AntiAlias                             None

SmoothingMode.AntiAlias http://www.ccswe.com/temp/SmoothingMode_AntiAlias.png SmoothingMode.Нет http://www.ccswe.com/temp/SmoothingMode_None.png

обновление: как Морбо указал, если Graphics объект, представленный вам в PaintEventArgs это не то же самое Graphics объект, который в конечном итоге будет использоваться для отображения, а затем изменение сглаживания может не иметь никакого эффекта. Хотя я не ожидал бы такой резкой разницы, если бы это было Graphics объект или что-то в этом роде.

хотел бы я предложить больше. Может быть, если бы я лучше понимал, что такое LineShape давал вам и ваши рассуждения об использовании его только с помощью одной из графиков.DrawLine() методы.

почему я вопрос ваше использование LineShape это то, что вы переопределяете его OnPaint и рисуете свою собственную линию. Кажется, вы могли бы упростить ваше заявление и канава LineShape но, может, я что-то упускаю.


обновление: Ok, что имеет смысл, почему вы используете LineShape затем. Единственное предложение, которое я могу предложить на данный момент, - переопределить OnPaint в вашей панели или LineShape, попробуйте установить там режим сглаживания перед вызовом базового события. Что-то вроде:

protected override void OnPaint(PaintEventArgs e)
{
    e.Graphichs.SmoothingMode = SmoothingMode.AntiAlias;
    base.OnPaint(e);
}

из того, что я могу сказать в Reflector, компонент Powerpack LineShape рисует с помощью графического объекта из исходного события Paint контейнера. Изменение свойств графического объекта может повлиять на все остальное в контейнере, который рисует после вашей фигуры.

каковы ваши объекты LineShape, содержащиеся в вашем образце? (Если это пользовательский элемент управления, вы создаете растровое изображение в какой-то момент? Как?) Если они находятся внутри пользовательского элемента управления с низкая глубина цвета, это может быть источником проблемы. LineShape рисует сглаженные по умолчанию на моей машине.


что настройки экрана? По крайней мере, 24 битный цвет?

Я могу подтвердить, что вывод класса из LineShape и переопределение OnPaint, как вы показали тут фактически влияет на рендеринг строки, как ожидалось. Я также могу подтвердить, что как Power Pack 3.0, так и версия в Visual Studio 2010 специально используют AntiAlias в LineShape.DrawInternal метод.

Я начал с пустого приложения .NET 2.0 Windows Forms. Я добавил следующий класс который почти идентичен вашему и форме, которая содержит только ShapeContainer и диагональную форму MyLine.

Imports Microsoft.VisualBasic.PowerPacks

Public Class MyLine
    Inherits LineShape

    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)

        Dim g As Graphics = e.Graphics

        'g.SmoothingMode = SmoothingMode.AntiAlias '

        Using pen As New Pen(Color.Blue, 3)
            g.DrawLine(pen, X1, Y1, X2, Y2)
        End Using

        'MyBase.OnPaint(e) '

    End Sub

End Class

Если я запускаю проект с указанным выше кодом как есть, строка сглаживается (jagged). Если я раскомментирую настройку SmoothingMode, линия станет сглаженной (гладкой).

Так что это определенно должно работать. Я знаю, что это кажется глупый вопрос, но вы проверили, чтобы убедиться, что ваш код в отладчике? Ты пытался позвонить? Графика.Flush () сразу после вашей DrawLine?

кроме того, какую версию PowerPack вы используете? Как я уже сказал, Я могу ясно видеть в отражателе эту линию.DrawInternal специально устанавливает SmoothingMode в AntiAlias в блоке try/finally. Он восстанавливает старый режим сглаживания перед возвратом. Но в вашем примере вы никогда не должны даже нажимать это, потому что вы не вызываете базовый метод.


вопрос был в моем режиме разработки: через подключение к удаленному рабочему столу на виртуальном ПК.

RDC не принимает во внимание в моем случае свойство antialias graphics.

подробнее: у вас были проблемы с разработкой на виртуальном ПК?

спасибо всем за участие, извините, что это не было действительно проблемой .NET.