2016-03-08 67 views
3

如何裁剪RenderTargetBitmap?相当于:UWP 10 RenderTargetBitmap在UWP中裁剪​​UIElement的区域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,但我认为这非常黑客。感谢您花时间尝试一下。 –