Захват изображения в 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.