Ottieni un’immagine bitmap da una vista di controllo

Mi piacerebbe “copiare negli appunti” ciò che un Control della mia app WPF disegna sullo schermo. Pertanto, ho bisogno di build un’immagine bitmap dal mio display corrente di controllo.

C’è un modo semplice per farlo ?

Grazie in anticipo.

Non lo chiamerei facile … ma il componente chiave è RenderTargetBitmap, che puoi usare come segue:

 RenderTargetBitmap rtb = new RenderTargetBitmap((int)control.ActualWidth, (int)control.ActualHeight, 96, 96, PixelFormats.Pbgra32); rtb.Render(control); 

Bene, quella parte è facile, ora la RTB ha i pixel memorizzati internamente … ma il tuo prossimo passo sarebbe metterlo in un formato utile per metterlo negli appunti, e capire che fuori può essere disordinato … c’è un molte classi correlate all’immagine che interagiscono tutte l’una o l’altra.

Ecco cosa usiamo per creare un System.Drawing.Image, che penso tu debba essere in grado di mettere negli appunti.

 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 (un’immagine di moduli) non può interagire direttamente con RenderTargetBitmap (una class WPF), quindi usiamo un MemoryStream per convertirlo.

Se il controllo che stai cercando di creare una bitmap da dentro uno StackPanel non funzionerà, otterrai solo un’immagine vuota.

Jaime Rodriguez ha un bel pezzo di codice per aggirare questo sul suo 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; }