netlib.narod.ru< Назад | Оглавление | Далее >

Сглаживание

Помимо четырех вышеперечисленных, у класса Graphics есть и другие свойства, влияние которых менее заметно, например SmoothingMode и PixelOffsetMode.


Свойства Graphics (выборочно)



Тип Свойство Доступ Описание

SmoothingMode SmoothingMode Чтение/запись Сглаживание линий
PixelOffsetMode PixelOffsetMode Чтение/запись Улучшенное сглаживание


Эти свойства обеспечивают поддержку методики визуализации графики, известную как сглаживание (anti-aliasing). Термин «alias» в данном контексте происходит из теории дискретизации. Сглаживание — это попытка скрыть резкие неровности выводимой графики с помощью полутонов.

Вот программа, рисующая небольшую линию. Среди прочего я включил в нее операторы, позволяющие устанавливать свойства SmoothingMode и PixelOffsetMode.

AntiAlias.cs

  //----------------------------------------
  // AntiAlias.cs © 2001 by Charles Petzold
  //----------------------------------------
  using System;
  using System.Drawing;
  using System.Drawing.Drawing2D;
  using System.Windows.Forms;

  class AntiAlias: Form
  {
      public static void Main()
      {
          Application.Run(new AntiAlias());
      }
      public AntiAlias()
      {
          Text = "Anti-Alias Demo";
          BackColor = SystemColors.Window;
          ForeColor = SystemColors.WindowText;
      }
      protected override void OnPaint(PaintEventArgs pea)
      {
          Graphics grfx = pea.Graphics;
          Pen      pen  = new Pen(ForeColor);

          grfx.SmoothingMode   = SmoothingMode.None;
          grfx.PixelOffsetMode = PixelOffsetMode.Default;

          grfx.DrawLine(pen, 2, 2, 18, 10);
      }
  }

Можно поэкспериментировать с различными комбинациями этих свойств. Для этого нужно перекомпилировать и исполнить программу, затем сделать снимок экрана и увеличить его в каком-нибудь графическом редакторе, чтобы полученные различия стали заметны. Есть и другой вариант: откиньтесь на спинку кресла и предоставьте все мне.

По умолчанию, линия визуализируется так:


Рис. 5.1.

Я специально включил в этот рисунок небольшую часть экрана за пределами клиентской области (наверху слева), чтобы хорошо было видно начало линии — пиксел с координатами (2, 2).

Перечисление SmoothingMode определяется в пространстве имен System.Drawing.Drawing2D:


Перечисление SmoothingMode



Член Значение Комментарий

Default 0 Без сглаживания
HighSped 1 Без сглаживания
HighQuality 2 Сглаживание включено
None 3 Без сглаживания
AntiAlias 4 Сглаживание включено
Invalid –1 Вызывает исключение


Реально здесь только три возможности выбора: есть сглаживание, нет сглаживания или будет вызвано исключение. По умолчанию задано значение None.

После включения сглаживания (это можно сделать, присвоив свойству SmoothingMode значение SmoothingMode.HighQuality или SmoothingMode.AntiAlias), линия принимает такой вид:


Рис. 5.2.

Такая линия расплывается, если разглядывать ее вблизи, но на более далеком расстоянии она выглядит более гладко (некоторые не согласны с этим, считая, что сглаживание делает изображение «размытым»).

Идея здесь в том, что линия начинается в центре пиксела (2, 2) и кончается в центре пиксела (18, 10), ее толщина — 1 пиксел., Когда графическая система использует сглаживание, интенсивность закрашивания пиксела черным определяется его удаленностью от теоретической линии.

Можно немного улучшить сглаживание, установив для свойства PixelOffsetMode одно из значений перечисления PixelOffsetMode (подобно SmoothingMode, определяемого в пространстве имен System.Drawing.Drawing2D):


Перечисление SmoothingMode



Член Значение Комментарий

Default 0 Смещение пикселов не включено
HighSped 1 Смещение пикселов не включено
HighQuality 2 Включено смещение на половину пиксела
None 3 Смещение пикселов не включено
Half 4 Включено смещение на половину пиксела
Invalid –1 Вызывает исключение


И здесь всего лишь три реальных возможности выбора, одна из которых бесполезна. Если свойству PixelOffsetMode присвоено значение Half или HighQuality, линия визуализируется так:


Рис. 5.3.

При включении смещения пиксела расчет координат осуществляется в соответствии с подходом, использующим аналитическую геометрию. Значение координат линии уменьшается на полпиксела. Предполагается, что линия начинается в точке, расположенной на расстоянии 2 пикселов от угла, которая на самом деле попадает в промежуток между соседними пикселами.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz