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
http://www.ccswe.com/temp/SmoothingMode_AntiAlias.png 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);
}
person
Cory Charlton
schedule
26.02.2010