Как отрисовать холст в растровом изображении, исключая из-за пределов элементов (C# WinRT)

У меня есть простое приложение для рисования, и я пытаюсь отобразить холст в растровое изображение, используя метод RenderTargetBitmap.RenderAsync(). Если дочерний элемент холста превышает границы холста, отображаемое растровое изображение больше, чем область холста... Как я могу избежать этого и получать только внутренние элементы? Я попробовал свойство clip объекта canvas, но оно работает только для пользовательского интерфейса, а не для рендеринга. ClipToBounds не доступен в WinRT...

1 ответ

Решение

Я столкнулся с той же проблемой. Вот что сработало для меня:

        Rect r = new Rect(new Point(0, 0), new Point(canvas.Width, canvas.Height));
        foreach (var c in canvas.Children)
            c.Clip = new RectangleGeometry() { Rect = r };


        RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
        await renderTargetBitmap.RenderAsync(canvas, (int)canvas.Width, (int)canvas.Height);

        FileSavePicker picker = new FileSavePicker();
        picker.FileTypeChoices.Add("JPEG Image", new string[] { ".jpg" });
        StorageFile file = await picker.PickSaveFileAsync();
        if (file != null)
        {
            var pixels = await renderTargetBitmap.GetPixelsAsync();

            using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
            {
                var encoder = await
                BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
                byte[] bytes = pixels.ToArray();
                encoder.SetPixelData(BitmapPixelFormat.Bgra8,
                    BitmapAlphaMode.Ignore,
                    (uint)canvas.Width, (uint)canvas.Height,
                    96, 96, bytes);

                await encoder.FlushAsync();
            }
        }

По сути, вы просто добавляете Clip ко всем дочерним элементам Canvas, поэтому все, что выходит за пределы, не будет отображаться с помощью RenderTargetBitmap.


Функцию ClipToBounds можно легко добавить через AttachedProperty: подробности

Другие вопросы по тегам