UWP 10 RenderTargetBitmap UWP 10中UIElement的裁剪区域

时间:2016-03-08 04:24:45

标签: xaml win-universal-app win2d

如何裁剪RenderTargetBitmap?相当于:

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

这个问题似乎很简单,但似乎没有真正的方法。以上语义总结了我的用例。我想渲染Xaml树的 part 。这是一个完全合法的用例。

保存到文件,这似乎是最常见的裁剪方式,真的不是一个好的答案。当然,也许有一天我会将裁剪的图像保存到我的媒体库中,但今天不行。

1 个答案:

答案 0 :(得分:2)

BitmapTransform and BitmapDecoder个类,其他功能允许您裁剪图像。但我尝试将像素数据从一个源传递到另一个源时,每次碰到HRESULT:0x88982F50异常时都无法使它们与RenderTargetBitmap一起使用。

至于不同的方法,我可以考虑带上大枪并用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,而且知识渊博的人可能想要对此代码进行更正。