快照产生的低质量图片。 WPF

时间:2019-04-20 10:33:42

标签: c# wpf

下面的程序创建一个快照,其中包含应用程序本身主窗口的内容。但是,所生成图片的质量不等于Windows 10的打印屏幕程序,后者会产生所需的结果。

以下是运行的程序的快照,是使用Windows 10的打印屏幕程序拍摄的,放大了:

https://ibb.co/wz4pb4d

这是下面的程序正在生成的快照,放大了:

https://ibb.co/DLsNb8X

我们是否可以尝试提高此程序产生的快照的质量?

我尝试了位图编码器,但结果相同,只是没有透明度,(不需要透明度)也尝试了其他一些像素格式,但是我遇到了错误,只有Pbgra32可以像程序一样工作。

        if (e.Key == Key.P)
        {
            //Set scrollviewer's Content property as UI element to capture full content
            UIElement element = mainwindow.Content as UIElement;
            Uri path = new Uri(@"C:\Users\4gry\Desktop\screenshot.png");
            CaptureScreen(element, path);
        }

    }
        public void CaptureScreen(UIElement source, Uri destination)
        {
            try
            {
                Double Height, renderHeight, Width, renderWidth;

                Height = renderHeight = source.RenderSize.Height;
                Width = renderWidth = source.RenderSize.Width;

                //Specification for target bitmap like width/height pixel etc.
                RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)renderWidth, (int)renderHeight, 96, 96, PixelFormats.Pbgra32);
                //creates Visual Brush of UIElement
                VisualBrush visualBrush = new VisualBrush(source);

                DrawingVisual drawingVisual = new DrawingVisual();
                using (DrawingContext drawingContext = drawingVisual.RenderOpen())
                {
                    //draws image of element
                    drawingContext.DrawRectangle(visualBrush, null, new Rect(new Point(0, 0), new Point(Width, Height)));
                }
                //renders image
                renderTarget.Render(drawingVisual);

                //PNG encoder for creating PNG file
                PngBitmapEncoder encoder = new PngBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(renderTarget));
                using (FileStream stream = new FileStream(destination.LocalPath, FileMode.Create, FileAccess.Write))
                {
                    encoder.Save(stream);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }



}

}

1 个答案:

答案 0 :(得分:0)

不确定这是否正是您要实现的目标,但是可以通过将源元素的RenderOptions.EdgeMode属性设置为EdgeMode.Aliased来避免抗锯齿效果。

还请注意,您还可以编写更简单的CaptureScreen方法:

public void CaptureScreen(UIElement source, string destination)
{
    RenderOptions.SetEdgeMode(source, EdgeMode.Aliased); // here

    var drawingVisual = new DrawingVisual();

    using (DrawingContext drawingContext = drawingVisual.RenderOpen())
    {
        drawingContext.DrawRectangle(
            new VisualBrush(source),
            null,
            new Rect(source.RenderSize));
    }

    var bitmap = new RenderTargetBitmap(
        (int)Math.Round(source.RenderSize.Width),
        (int)Math.Round(source.RenderSize.Height),
        96, 96, PixelFormats.Default);

    bitmap.Render(drawingVisual);

    var encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bitmap));

    using (var stream = new FileStream(destination, FileMode.Create))
    {
        encoder.Save(stream);
    }
}

要创建分辨率更高的图像,请使用DPI参数代替默认的96,如下所示:

public void CaptureScreen(UIElement source, double dpi, string destination)
{
    RenderOptions.SetEdgeMode(source, EdgeMode.Aliased);

    var drawingVisual = new DrawingVisual();

    using (DrawingContext drawingContext = drawingVisual.RenderOpen())
    {
        drawingContext.DrawRectangle(
            new VisualBrush(source),
            null,
            new Rect(source.RenderSize));
    }

    var bitmap = new RenderTargetBitmap(
        (int)Math.Round(source.RenderSize.Width * dpi / 96),
        (int)Math.Round(source.RenderSize.Height * dpi / 96),
        dpi, dpi, PixelFormats.Default);

    bitmap.Render(drawingVisual);

    var encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bitmap));

    using (var stream = new FileStream(destination, FileMode.Create))
    {
        encoder.Save(stream);
    }
}