Как нарисовать гладкие изображения с C#?
Я пытаюсь нарисовать изображения в форме C# (в PictureBoxes, а также с помощью Graphics.DrawImage()), и ищу способ нарисовать их гладкими. Изображения должны быть в формате, который поддерживает прозрачность, поэтому PNG, GIF, SVG и WMF. C# не поддерживает файлы SVG из коробки, и я не нашел хорошую стороннюю библиотеку для использования (я нашел SvgNet, но не смог понять это).
Мне нужно нарисовать файл WMF, что C# может сделать с помощью функции Image.FromFile(), но это не сглаживание. Мне было интересно, есть ли способ сгладить это?
2 ответа
Предыдущие ответы, хотя и задуманные, были лишь частично правильными.
Что было правильно? PictureBox не предоставляет InterpolationMode.
Что было с базы?
1) Хотя вы можете легко установить это свойство в событии Paint из поля рисунка, в его родительском элементе или с помощью переопределения в производном классе.,, В любом случае работает, и оба так же легко. Однако, если не установлен SmoothingMode, InterpolationMode будет игнорироваться. Вы не получите никакого сглаживания без SmoothingMode, установленного в SmoothingMode.AnitAlias.
2) Использование панели, когда вы явно проявили интерес к использованию функций PictureBox, является неправильным направлением. У вас не будет возможности загружать, сохранять или присваивать изображения непосредственно ему без явного кодирования этих свойств.,, Зачем заново изобретать колесо? Получив от PictureBox вы получаете все это бесплатно.
Новости становятся еще лучше, поскольку я выполнил для вас тяжелую работу, и это заняло у меня меньше времени, чем написание этого сообщения.
Я предоставил две версии, обе из которых происходят от PictureBox. Во-первых, это простой пример, в котором всегда используется наилучшее качество рендеринга. Это также самый медленный рендеринг. Второй - это класс, который позволяет любому установить различные параметры рендеринга через свойства из производного класса. После установки они используются в переопределении OnPaint.
public class HighQualitySmoothPictureBox : PictureBox
{
protected override void OnPaint(PaintEventArgs pe)
{
// This is the only line needed for anti-aliasing to be turned on.
pe.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
// the next two lines of code (not comments) are needed to get the highest
// possible quiality of anti-aliasing. Remove them if you want the image to render faster.
pe.Graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
pe.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
// this line is needed for .net to draw the contents.
base.OnPaint(pe);
}
}
...
public class ConfigurableQualityPictureBox : PictureBox
{
// Note: the use of the "?" indicates the value type is "nullable."
// If the property is unset, it doesn't have a value, and therefore isn't
// used when the OnPaint method executes.
System.Drawing.Drawing2D.SmoothingMode? smoothingMode;
System.Drawing.Drawing2D.CompositingQuality? compositingQuality;
System.Drawing.Drawing2D.InterpolationMode? interpolationMode;
public System.Drawing.Drawing2D.SmoothingMode? SmoothingMode
{
get { return smoothingMode; }
set { smoothingMode = value; }
}
public System.Drawing.Drawing2D.CompositingQuality? CompositingQuality
{
get { return compositingQuality; }
set { compositingQuality = value; }
}
public System.Drawing.Drawing2D.InterpolationMode? InterpolationMode
{
get { return interpolationMode; }
set { interpolationMode = value; }
}
protected override void OnPaint(PaintEventArgs pe)
{
if (smoothingMode.HasValue)
pe.Graphics.SmoothingMode = smoothingMode.Value;
if (compositingQuality.HasValue)
pe.Graphics.CompositingQuality = compositingQuality.Value;
if (interpolationMode.HasValue)
pe.Graphics.InterpolationMode = interpolationMode.Value;
// this line is needed for .net to draw the contents.
base.OnPaint(pe);
}
}
При рисовании изображения на холсте вы можете изменить режим интерполяции на более приятный, чем у ближайшего соседа, чтобы сделать изображения с измененными размерами более плавными:
Graphics g = ...
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(...);
Вам нужно добавить System.Drawing.Drawing2D, чтобы получить перечисление InterpolationMode.
Использование PictureBox будет проблемой - оно не предоставляет свойство InterpolationMode, поэтому вам нужно будет свернуть свое или загрузить его.