代码之家  ›  专栏  ›  技术社区  ›  Aurelien Ribon

从控件视图获取位图图像

wpf
  •  18
  • Aurelien Ribon  · 技术社区  · 16 年前

    Control 我的 WPF 应用程序在屏幕上绘图。 因此,我需要建立一个位图图像从我的控制当前显示。

    有什么简单的方法吗?

    提前谢谢。

    2 回复  |  直到 16 年前
        1
  •  41
  •   Bubblewrap    16 年前

    我不认为这很容易…但关键组件是RenderTargetBitmap,您可以使用它,如下所示:

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

    PngBitmapEncoder png = new PngBitmapEncoder();
    png.Frames.Add(BitmapFrame.Create(rtb));
    MemoryStream stream = new MemoryStream();
    png.Save(stream);
    Image image = Image.FromStream(stream);
    

    Image(表单图像)不能直接与RenderTargetBitmap(WPF类)交互,因此我们使用MemoryStream来转换它。

        2
  •  14
  •   Björn    11 年前

    如果试图从中创建位图的控件位于 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;
    }
    
        3
  •  1
  •   PockyBum522    5 年前

    这在你的代码背后: (或者从窗户进来。)

    不是我的,而是我的一堆,还有谷歌。在.NET5和WPF中工作

        public void RenderThisWindow(string fullPngPath)
        {
            Image myImage = new Image();
            
            DrawingVisual drawingVisual = new DrawingVisual();
    
            RenderTargetBitmap bmp = new RenderTargetBitmap((int)Width, (int)Height, 120, 96, PixelFormats.Pbgra32);
            bmp.Render(this);
            myImage.Source = bmp;
    
            SaveToPng(this, fullPngPath);
        }
        
        private void SaveToPng(FrameworkElement visual, string fileName)
        {
            var encoder = new PngBitmapEncoder();
            SaveUsingEncoder(visual, fileName, encoder);
        }
        
        private void SaveUsingEncoder(FrameworkElement visual, string fileName, BitmapEncoder encoder)
        {
            RenderTargetBitmap bitmap = new RenderTargetBitmap((int)visual.Width, (int)visual.Width, 96, 96, PixelFormats.Pbgra32);
            bitmap.Render(visual);
            BitmapFrame frame = BitmapFrame.Create(bitmap);
            encoder.Frames.Add(frame);
    
            using (var stream = File.Create(fileName))
            {
                encoder.Save(stream);
            }
        }