Режим 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);
}