Захват изображения в WPF и печать захваченного изображения

В предыдущей статье рассматривался порядок печати визуальных объектов WPF с подстраиванием под страницу печати. Теперь мы изучим, как захватить изображение в WPF и распечатать его на принтере в соответствии с размером страницы печати.

Этапы захвата и печати изображения

  • Добавьте ссылку библиотеки ReachFramework.dll.
  • Добавьте ссылку библиотеки System.Printing.dll.
  • Получите характеристики выбранного принтера.
  • Вычислите масштабирование принтера относительно печатаемого визуального объекта.
  • Захватите изображение визуального элемента.
  • Создайте новый визуальный объект.
  • Создайте контекст рисования из нового визуального объекта.
  • Преобразуйте изображение в контекст рисования.
  • Закройте контекст рисования; теперь визуальный объект содержит захваченное изображение.
  • Распечатайте новый визуальный объект.

Код в обработчике btnPrintCaptureImage_OnClick 

PrintDialog printDlg = new System.Windows.Controls.PrintDialog();
if(printDlg.ShowDialog() == true)
   {
 
      //get selected printer capabilities
      System.Printing.PrintCapabilities capabilities = printDlg.PrintQueue.GetPrintCapabilities(printDlg.PrintTicket);
 
      //get scale of the print wrt to screen of WPF visual
      double scale = Math.Min(capabilities.PageImageableArea.ExtentWidth / this.ActualWidth,
                    capabilities.PageImageableArea.ExtentHeight /
                    this.ActualHeight);
 
     //get the size of the printer page
     Size sz = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
 
     //Capture the image of the visual in the same size as Printing page.
     RenderTargetBitmap bmp = new RenderTargetBitmap((int)this.ActualWidth, (int)this.ActualHeight, 96, 96, PixelFormats.Pbgra32);
    bmp.Render(this);
 
    //create new visual which would be initialized by image
    DrawingVisual vis = new DrawingVisual();
  //create a drawing context so that image can be rendered to print
  DrawingContext dc = vis.RenderOpen();
  dc.DrawImage(bmp,new System.Windows.Rect(sz));
  dc.Close();
 
 //now print the image visual to printer to fit on the one page.
 printDlg.PrintVisual(vis, "Image Fit to Page WPF Print");
}

Выводы. Теперь мы знаем способ захвата изображения и печати этого захваченного изображения в WPF.