2016-03-08 11 views
3

Как обрезать RenderTargetBitmap? Эквивалент:UWP 10 RenderTargetBitmap обрезанная область UIElement в UWP 10

RenderTargetBitmap bmp = new RenderTargetBitmap(); 
    await bmp.RenderAsync(element , cropRect); 

Этот вопрос кажется достаточно простым, но, похоже, нет реального способа сделать это. Приведенное выше семантически суммирует мой пример использования. Я хочу отобразить часть дерева Xaml. Это совершенно законный вариант использования.

Сохранение файла, который, как представляется, является наиболее распространенным способом обрезки, на самом деле не является хорошим ответом. Конечно, возможно, однажды я сохраню обрезанное изображение в моей медиа-библиотеке, но не сегодня.

ответ

2

Есть классы BitmapTransform and BitmapDecoder, которые среди других функций позволяют обрезать изображения. Но мне не удалось заставить их работать с RenderTargetBitmap, каждый раз натыкаясь на исключение HRESULT: 0x88982F50 при попытке передать данные пикселей из одного источника в другой.

Что касается разного подхода, я могу придумать, как принести большие пушки и реализовать его с помощью Win2D. Это может быть не самым удобным решением, но это работает:

var renderTargetBitmap = new RenderTargetBitmap(); 
await renderTargetBitmap.RenderAsync(element, width, height); 
var pixels = await renderTargetBitmap.GetPixelsAsync(); 

var currentDpi = DisplayInformation.GetForCurrentView().LogicalDpi; 
var device = CanvasDevice.GetSharedDevice(); 
var imageSource = new CanvasImageSource(device, width, height, currentDpi); 

using (var drawingSession = imageSource.CreateDrawingSession(Colors.Transparent)) 
using (var bitmap = CanvasBitmap.CreateFromBytes(
    drawingSession, pixels.ToArray(), width, height, 
    DirectXPixelFormat.B8G8R8A8UIntNormalized, drawingSession.Dpi)) 
{ 
    var cropEffect = new CropEffect 
    { 
     Source = bitmap, 
     SourceRectangle = cropRect, 
    }; 

    drawingSession.DrawImage(cropEffect); 
} 

ResultImage.Source = imageSource; 

Обратите внимание, что я не Win2D expret и кто-то более знающий, возможно, захотите внести исправления в этом коде.

+0

Я знаю, какой путь вы взяли, потому что я прошел через те же проблемы. В настоящее время я тоже полагаюсь на Win2D, но я думаю, что это очень хак. Спасибо, что нашли время попробовать. –