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

Визуализация изображений

Как показано в предыдущих программах, метод класса Graphics, выводящий изображение, называется DrawImage. Наличие 30 его версий обеспечивает большую гибкость при программировании. Есть и еще один метод вывода изображений, DrawImageUnscaled, но его функциональность такая же, как у DrawImage.

Как и в случае с выводом текста, вывод изображения включает обработку объекта, уже имеющего определенный размер. Строка текста, связанная с определенным шрифтом, имеет размер, и растровое изображение также обладает размером, вернее, двумя — в пикселах и метрическим. Вывод в метрическом размере (осуществляемый простейшими версиями метода DrawImage) полезен для аппаратно-независимой обработки изображений. И все же, если единицы измерения при выводе — пикселы, для оценки пиксельного размера представленного таким образом изображения потребуется немного посчитать (подробнее об этом чуть позже). Иногда, особенно при их интеграции с элементами управления, изображения требуется выводить в пиксельном размере. Метод DrawImage не использует пиксельный размер автоматически, однако его легко настроить для этого.

Обычно битовые карты устойчивы к разного рода преобразованиям, например вращению. В Windows Forms и GDI+ мировое преобразование влияет на вывод изображений так же, как и на вывод текста.

Первый аргумент всех версий метода DrawImage — объект типа Image. Самый последний — точка начала координат. Она может быть представлена двумя значениями типа int или float, значением типа Point, PointF, Rectangle или RectangleF и определяет мировые координаты левого верхнего угла картинки.

Следующие четыре метода DrawImage масштабируют изображение, используя его метрический размер:


Методы DrawImage класса Graphics (выборочно)



void DrawImage(Image image, int x, int y)
void DrawImage(Image image, float x, float y)
void DrawImage(Image image, Point pt)
void DrawImage(Image image, PointF ptf)


Размер изображения не зависит от преобразований страницы, но зависит от мирового преобразования. Эти четыре метода DrawImage используются аналогично вызову метода DrawString, которому передан объект Font, созданный с применением метрического размера. Итоговое изображение имеет одинаковый метрический размер как на дисплее, так и на принтере.

Например, размер изображений Apollo 11 — 220 × 240 пикселов, а разрешение — 72 dpi. Таким образом, при выводе с помощью вышеупомянутых версий метода DrawImage их размер составит приблизительно 3 × 31/3 дюйма.

JPEG-файл с Web-узла NASA, загружаемый программой ImageFromWeb, имеет размер 640 × 480 пикселов, но не содержит информации о разрешении. В этом случае предполагается, что разрешение изображения равно экранному (обычно 96 или 120 dpi).

Иногда требуется предварительно оценить размер выводимого изображения, например, чтобы разместить его посередине прямоугольника. Поскольку четыре версии метода DrawImage выводят его в метрическом размере, для его центровки потребуется выполнить дополнительные действия, что показывает следующая программа.

CenterImage.cs

  //--------------------------------------------
  // CenterImage.cs (C) 2001 by Charles Petzold
  //--------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class CenterImage: PrintableForm
  {
      Image image;

      public new static void Main()
      {
          Application.Run(new CenterImage());
      }
      public CenterImage()
      {
          Text = "Center Image";

          image = Image.FromFile("..\\..\\..\\Apollo11FullColor.jpg");
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {
          grfx.PageUnit = GraphicsUnit.Pixel;
          grfx.PageScale = 1;

          RectangleF rectf = grfx.VisibleClipBounds;

          float cxImage = grfx.DpiX * image.Width / 
                                             image.HorizontalResolution;
          float cyImage = grfx.DpiY * image.Height / 
                                             image.VerticalResolution;

          grfx.DrawImage(image, (rectf.Width  - cxImage) / 2, 
                                (rectf.Height - cyImage) / 2);
      }
  }

Значения параметров cxImage и cyImage измеряются в пикселах. Разделив ширину и высоту изображения в пикселах на горизонтальное и вертикальное разрешение, вы получите размеры картинки в дюймах. Умножив полученный результат на значения свойств DpiX и DpiY, вы получите размер выведенного изображения в пикселах устройства.

Если изображение выводится только на дисплей, можно вычесть значения cxImage и cyImage из ширины и высоты клиентской области и разделить результат на 2. Однако такой расчет не подходит для принтера. Поэтому в начале метода DoPage, я перехожу к координатам в пикселах и методом VisibleClipBounds получаю размер устройства вывода в пикселах. Затем из ширины и высоты устройства вычитаются значения cxImage и cyImage, и результат делится на 2.


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

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