El SmoothingMode definitivamente debe afectar a su salida
Aquí hay algunos ajustes que utilicé recientemente para cambiar el tamaño de una imagen con mini Mal pérdida de calidad:
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
El InterpolationMode probablemente no es relevante por su ejemplo, pero el PixelOffsetMode podría ser. Déjame girar una aplicación de prueba rápida.
Actualización: Aquí está la aplicación de prueba rápida, SmoothingMode definitivamente impacta las líneas que dibujo.
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
Actualización: Como Morbo señaló si el objeto Graphics
presentado a usted en el PaintEventArgs
no es lo mismo Graphics
objeto que será en última instancia utilizado para la visualización y luego cambiar el suavizado podría no tener ningún efecto. Aunque no esperaría una diferencia tan drástica si ese fuera un objeto Graphics
de una memoria Image
o algo así.
Desearía poder ofrecer más. Tal vez si entendiera mejor lo que le estaba dando el LineShape
y su razonamiento para usarlo simplemente usando uno de los métodos Graphics.DrawLine().
La razón por la que cuestiono su uso del LineShape
es que está anulando su OnPaint y está dibujando su propia línea. Parece que podría simplificar su aplicación y abandonar el LineShape
, pero tal vez me falta algo.
Actualización: Ok que tiene sentido por qué está utilizando el LineShape
a continuación.La única sugerencia que puedo ofrecer en este momento es anular OnPaint en su panel o LineShape, intente configurar el modo de suavizado allí antes de llamar al evento base. Algo así como:
protected override void OnPaint(PaintEventArgs e)
{
e.Graphichs.SmoothingMode = SmoothingMode.AntiAlias;
base.OnPaint(e);
}
¿Estás diciendo que la línea no tiene antialias? Independientemente de la configuración? – Finglas
@Finglas: Sí. Exactamente. – serhio