Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从UIElement获取的图像被裁剪为显示的大小_C#_Wpf_Image_Image Processing_Uielement - Fatal编程技术网

C# 从UIElement获取的图像被裁剪为显示的大小

C# 从UIElement获取的图像被裁剪为显示的大小,c#,wpf,image,image-processing,uielement,C#,Wpf,Image,Image Processing,Uielement,我正在使用以下代码拍摄wpf控件的图像: BitmapEncoder imgEncoder = new PngBitmapEncoder(); RenderTargetBitmap bmpSource = new RenderTargetBitmap((int)element.ActualWidth, (int)element.ActualHeight, 150, 150, PixelFormats.Pbgra32); bmpSource.Render(element); imgEncoder.

我正在使用以下代码拍摄wpf控件的图像:

BitmapEncoder imgEncoder = new PngBitmapEncoder();
RenderTargetBitmap bmpSource = new RenderTargetBitmap((int)element.ActualWidth, (int)element.ActualHeight, 150, 150, PixelFormats.Pbgra32);
bmpSource.Render(element);
imgEncoder.Frames.Add(BitmapFrame.Create(bmpSource));
using (MemoryStream ms = new MemoryStream())
{
    imgEncoder.Save(ms);
    bytes = ms.ToArray();
    ms.Position = 0;
    Image i = Image.FromStream(ms);
    i.Save(@"C:\" + Guid.NewGuid().ToString() + "LARGE.png");
}
问题在于
ActualHeight/Width
属性给出了渲染的高度和宽度,即显示的部分。我想保存整个控件的图像,即使某些控件在屏幕上不可见,即它被放置在scrollviewer中


如何获取控件的完整大小/高度,以便bmpSource.Render()将整个控件渲染为图像?

您可以尝试暂时将控件从其上下文中移除(如果绑定,可能会导致问题),将其转换为可见点,或将其滚动到视图中进行渲染

     private static void SaveUsingEncoder(string fileName, FrameworkElement UIElement, BitmapEncoder encoder)
    {
        int height = (int)UIElement.ActualHeight;
        int width = (int)UIElement.ActualWidth;

        // These two line of code make sure that you get completed visual bitmap.
        // In case your Framework Element is inside the scroll viewer then some part which is not
        // visible gets clip.  
        UIElement.Measure(new System.Windows.Size(width, height));
        UIElement.Arrange(new Rect(new System.Windows.Point(), new Point(width, height)));

        RenderTargetBitmap bitmap = new RenderTargetBitmap(width,

                                                                height,
                                                                96, // These decides the dpi factors 
                                                                96,// The can be changed when we'll have preview options.
                                                                PixelFormats.Pbgra32);
        bitmap.Render(UIElement);

        SaveUsingBitmapTargetRenderer(fileName, bitmap, encoder);
    }


     private static void SaveUsingBitmapTargetRenderer(string fileName, RenderTargetBitmap renderTargetBitmap, BitmapEncoder bitmapEncoder)
    {
        BitmapFrame frame = BitmapFrame.Create(renderTargetBitmap);
        bitmapEncoder.Frames.Add(frame);
        // Save file .
        using (var stream = File.Create(fileName))
        {
            bitmapEncoder.Save(stream);
        }
    }
将此函数称为

     SaveUsingEncoder(fileName, frameworkElement, new PngBitmapEncoder());

希望这会有所帮助。

你说的可见点是什么意思,我尝试给它一个新的大小并调用updatelayout(),但它会恢复到原来的大小?可见点是任何保证可见的点,使用ScrollViewer滚动视口通常比将控件移动到视口更容易。