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

У меня всегда есть тот же результат, как это: сопроводительный текст 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

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

сопроводительный текст http://lh3.ggpht.com/_1TPOP7DzY1E/S447qYvTqzI/AAAAAAAADE8/eP3kCLqQJbk/s800/Capture2.png

по-видимому режим сглаживания не является взятой невнимательностью...

6
задан serhio 3 March 2010 в 10:38
поделиться

4 ответа

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

В моем случае RDC не принимает во внимание графическое свойство AntiAlias.

подробнее: Были ли у вас проблемы при разработке на Virtual PC?

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

0
ответ дан 16 December 2019 в 21:39
поделиться

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

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

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

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

Обновление: Вот приложение для быстрого тестирования, SmoothingMode определенно влияет на линии, которые я рисую.

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.None http://www.ccswe.com/temp/SmoothingMode_None.png

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

Хотел бы я предложить больше. Может быть, если бы я лучше понимал, что LineShape давал вам, и ваши аргументы в пользу его использования вместо одного из методов Graphics.DrawLine ().

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


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

protected override void OnPaint(PaintEventArgs e)
{
    e.Graphichs.SmoothingMode = SmoothingMode.AntiAlias;
    base.OnPaint(e);
}
4
ответ дан 16 December 2019 в 21:39
поделиться

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

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

2
ответ дан 16 December 2019 в 21:39
поделиться

Какие настройки отображения установлены? По крайней мере, 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

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

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

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

2
ответ дан 16 December 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: