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

Вывод части изображения

Если посчитать, вы увидите, что к настоящему моменту я описал только 10 из 30 версий метода DrawImage. Оставшиеся методы позволяют вам указать прямоугольную область растрового изображения, которая будет выведена. Местоположение выводимой области указывается в пикселах относительно верхнего левого угла изображения. Для объекта Image с именем image прямоугольник

  new Rectangle(0, 0, image.Width, image.Height)

соответствует всему изображению, а прямоугольник

  new Rectangle(image.Width - 10, image.Height - 10, 10, 10)

соответствует квадратному фрагменту размером 10 × 10 пикселей, находящемуся в правом нижнем углу изображения.

Вот две версии DrawImage, в которых указывается местоположение в виде точки в мировых координатах, прямоугольная область источника, определяющая фрагмент изображения, и аргумент GraphicsUnit.


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



void DrawImage(Image image, int xDst, int yDst,
               Rectangle rectSrc, GraphicsUnit gu)
void DrawImage(Image image, float xDst, float yDst,
               RectangleF rectfSrc, GraphicsUnit gu)


Концепция здесь более проста, чем может показаться из причудливого описания методов. Во-первых, вы всегда указываете размер исходного прямоугольника в пикселах (так что версия DrawImage, определенная со структурой RectangleF вместо Rectangle не имеет смысла). Во-вторых, значение аргумента GraphicsUnit должно быть GraphicsUnit.Pixel. Я случайно знаю, что координаты шлема База Олдрина на используемом изображении могут быть описаны прямоугольником

  new Rectangle(95, 0, 50, 55)

Рассмотрим программу, которая выводит именно эту часть изображения.

PartialImage.cs

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

  class PartialImage: PrintableForm
  {
      Image image;

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

          image = Image.FromFile("..\\..\\..\\Apollo11FullColor.jpg");
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {
          Rectangle rect = new Rectangle(95, 5, 50, 55);

          grfx.DrawImage(image, 0, 0, rect, GraphicsUnit.Pixel);
      }
  }

Каков будет размер итогового изображения? Поскольку разрешение файла — 72 dpi, он составит 50/72 × 55/72 дюйма.


Рис. 11.9.

Кроме того, имеется четыре метода, позволяющих указать и исходный и конечный прямоугольники.


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



void DrawImage(Image image, Rectangle rectDst,
               int xSrc, int ySrc, int cxSrc, int cySrc,
               GraphicsUnit gu, * )
void DrawImage(Image image, Rectangle rectDst,
               Rectangle rectSrc,
               GraphicsUnit gu)
void DrawImage(Image image, Rectangle rectDst,
               float x, float y, float cx, float cy,
               GraphicsUnit gu, * )
void DrawImage(Image Image, RectangleF rectfDst,
               RectangleF rectfSrc,
               GraphicsUnit gu)


Здесь исходный прямоугольник указывается в пикселах, а конечный — в мировых координатах. Аргумент GraphicsUnit должен иметь значение GraphicsUnit.Pixel.

Заметьте: в конце списка аргументов двух методов я поставил звездочку. Она означает, что эти методы могут также принимать три дополнительных аргумента: объект ImageAttribute, функцию обратного вызова для отмены вывода изображения и данные, передаваемые этой функции. Таким образом, существует три дополнительных версии каждого из методов со звездочкой (к сожалению, они не обсуждаются в этой книге).

Следующая программа выводит шлем Олдрина (исходный прямоугольник) на всю клиентскую область или страницу принтера (конечный прямоугольник).

PartialImageStretch.cs

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

  class PartialImageStretch: PrintableForm
  {
      Image image;

      public new static void Main()
      {
          Application.Run(new PartialImageStretch());
      }
      public PartialImageStretch()
      {
          Text = "Partial Image Stretch";

          image = Image.FromFile("..\\..\\..\\Apollo11FullColor.jpg");
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {
          Rectangle rectSrc = new Rectangle(95, 5, 50, 55);
          Rectangle rectDst = new Rectangle( 0, 0, cx, cy);

          grfx.DrawImage(image, rectDst, rectSrc, GraphicsUnit.Pixel);
      }
  }

Вот итоговое изображение, растянутое до размеров клиентской области.


Рис. 11.10.

Если соотношение размеров конечного прямоугольника отличается от исходного, картинка искажается. Однако для вывода частей изображения можно легко использовать обсуждавшийся ранее метод ScaleImageIsotropically. Чтобы вывести картинку в пискельном размере, задайте ширину и высоту конечного прямоугольника равными размерам исходного прямоугольника.

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

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


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



void DrawImage(Image image, Point[] aptDst,
               Rectangle rectSrc, GraphicsUnit gu, * )
void DrawImage(Image image, PointF[] aptfDst,
               RectangleF rectfSrc, GraphicsUnit gu, * )


Исходный прямоугольник указан в пикселах, конечные точки даны в мировых координатах, а аргумент GraphicsUnit должен быть GraphicsUnit.Pixel. Вот пример программы.

PartialImageRotate.cs

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

  class PartialImageRotate: PrintableForm
  {
      Image image;

      public new static void Main()
      {
          Application.Run(new PartialImageRotate());
      }
      public PartialImageRotate()
      {
          Text = "Partial Image Rotate";

          image = Image.FromFile("..\\..\\..\\Apollo11FullColor.jpg");
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {
          Point[] aptDst = { new Point(0, cy / 2),
                             new Point(cx / 2, 0),
                             new Point(cx / 2, cy) };

          Rectangle rectSrc = new Rectangle(95, 5, 50, 55);

          grfx.DrawImage(image, aptDst, rectSrc, GraphicsUnit.Pixel);
      }
  }

Вот теперь, если вы по-прежнему внимательно следите за повествованием, то должны насчитать 30 методов DrawImage.


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

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