【问题标题】:Getting Image from UIElement is cropped to displayed size从 UIElement 获取图像被裁剪为显示大小
【发布时间】:2011-10-25 17:24:26
【问题描述】:

我正在使用此代码拍摄 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 属性给出了渲染的高度和宽度,即显示的部分。我想保存整个控件的图像,即使某些控件在屏幕上不可见,即它被放置在滚动查看器中。

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

【问题讨论】:

    标签: c# wpf image image-processing uielement


    【解决方案1】:

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

    【讨论】:

    • 可见点是什么意思,我试过给它一个新大小并调用 updatelayout() 但它恢复到原来的大小?
    • 可见点是保证可见的任何点,对于滚动查看器,滚动视口通常比将控件移动到视口更容易。
    【解决方案2】:
         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());
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多