Получение изображения из UIElement обрезается до отображаемого размера - PullRequest
3 голосов
/ 12 августа 2011

Я снимаю изображение элемента управления 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 () отображает весь элемент управления изображению?

Ответы [ 2 ]

1 голос
/ 15 ноября 2011
     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());

Надеюсь, это поможет.

0 голосов
/ 12 августа 2011

Вы можете попытаться временно вывести элемент управления из его контекста (может вызвать проблемы при привязке), трансформировать его в видимую точку или прокрутить его для отображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...