Я хотел бы "скопировать в буфер обмена", что Control
моего приложения WPF
рисует на экране.
Поэтому мне нужно создать растровое изображение с моего текущего дисплея управления.
Есть ли простой способ сделать это?
Спасибо заранее.
Я хотел бы "скопировать в буфер обмена", что Control
моего приложения WPF
рисует на экране.
Поэтому мне нужно создать растровое изображение с моего текущего дисплея управления.
Есть ли простой способ сделать это?
Спасибо заранее.
Я бы не назвал это легким... но ключевым компонентом является RenderTargetBitmap, который вы можете использовать следующим образом:
RenderTargetBitmap rtb = new RenderTargetBitmap((int)control.ActualWidth, (int)control.ActualHeight, 96, 96, PixelFormats.Pbgra32);
rtb.Render(control);
Ну, эта часть проста, теперь RTB имеет пиксели, хранящиеся внутри... но ваш следующий шаг будет помещать это в полезный формат, чтобы поместить его в буфер обмена, и полагая, что это может быть грязным... существует много классов, связанных с изображением, которые все взаимодействуют тем или иным образом.
Здесь мы используем для создания System.Drawing.Image, который, я думаю, вы можете разместить в буфере обмена.
PngBitmapEncoder png = new PngBitmapEncoder();
png.Frames.Add(BitmapFrame.Create(rtb));
MemoryStream stream = new MemoryStream();
png.Save(stream);
Image image = Image.FromStream(stream);
System.Drawing.Image(образ формы) не может напрямую взаимодействовать с RenderTargetBitmap (класс WPF), поэтому мы используем MemoryStream для его преобразования.
Если элемент управления, который вы пытаетесь создать растровое изображение, находится внутри StackPanel
, он не будет работать, вы просто получите пустое изображение.
У Хайме Родригеса есть хороший кусок кода, чтобы обойти это на blog:
private static BitmapSource CaptureScreen(Visual target, double dpiX, double dpiY)
{
if (target == null)
{
return null;
}
Rect bounds = VisualTreeHelper.GetDescendantBounds(target);
RenderTargetBitmap rtb = new RenderTargetBitmap((int)(bounds.Width * dpiX / 96.0),
(int)(bounds.Height * dpiY / 96.0),
dpiX,
dpiY,
PixelFormats.Pbgra32);
DrawingVisual dv = new DrawingVisual();
using (DrawingContext ctx = dv.RenderOpen())
{
VisualBrush vb = new VisualBrush(target);
ctx.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
}
rtb.Render(dv);
return rtb;
}