Я хотел бы "скопировать в буфер обмена", что 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;
}